2012-02-13 44 views
1

我想知道如何从Texture2D中删除一部分Texture。 我有一个简单的游戏,在这个游戏中,当一颗子弹击中它时,我想一块一块地炸毁行星。在Texture2D中切割孔

物理已经工作,但我坚持如何正确地切割纹理。

我需要创建一个函数,它将Texture2D的位置和半径作为输入并返回新的Texture2D。

下面是我想要完成的之前和之后的Texture2D示例。 http://img513.imageshack.us/img513/6749/redplanet512examplesmal.png

另请注意,我在火山口洞周围画了一个薄的棕色边框。如果这是可能的,这将是一个很大的奖励。

+0

为了澄清,我希望被切掉的部分是透明的。 – JensB 2012-02-13 08:34:33

回答

4

在做了很多关于该主题的搜索之后,它似乎是达到我想要的效果的最好和最快的方法是使用像素着色器。

更具体地说是一种名为'Alpha映射'的着色器方法。 Alpha映射通过使用原始纹理和另一个定义哪些部分可见或不可见的灰度纹理完成。

着色器的想法是遍历原始纹理中的每个像素,并检查灰度图像中的每个像素在同一坐标处的黑度。灰度图片中的像素越黑,原始纹理中的像素的alpha值越高(更明显)。由于所有这些都是在GPU上完成的,因此它闪电般快速,并让CPU准备好为游戏制作实际逻辑。

对于我的示例,我将创建一个黑色图像用作我的灰度图像,然后在此对应于要删除的部分上绘制白色圆圈。

我发现一个MSDN的例子有工作XNA 4,做这个(猫例子)的源代码:

http://create.msdn.com/en-US/education/catalog/sample/sprite_effects

编辑: 我这很好地工作。在这里创建一个包含源代码的小教程:http://syntaxwarriors.com/2012/xna-alpha-mapping-with-pixel-shaders/

0

这样做的一个好方法是在行星纹理顶部使用alphablend渲染一个“孔纹理”。想想它就像在原始纹理上绘制隐形圆圈一样。 看看这个线程的一些不错的链接worms-style-destructible-terrain

为了达到你的棕色边缘,我猜你需要采取类似的方法。首先将半径为10px的洞渲染到你的地形上。然后从同一原点渲染另一个圆,但半径稍大一些,例如12px。然后,您需要将此圆圈设置为导致棕色的blendmode。

+0

我可能会在这里错过一些非常简单的东西,但是.. 我设置了我的RenderTarget2D,绘制了我的原始纹理,然后想渲染我的洞..我怎么会渲染洞?纹理是方形的..所以我不能在透明方形纹理的中心有一个透明的圆圈,或者我可以吗? – JensB 2012-02-13 12:10:43

+0

在其中一个子线程上(http://web.archive.org/web/20090101215451/http://blog.xna3.com/2007/12/2d-deformable-level.html)。他们使用SetData和GetData来实现我之后的结果,但这是将问题提交给CPU,而不是在GPU上执行,因此应该慢得多,并且实际上不是一个好的解决方案,对吧? – JensB 2012-02-13 12:14:09

+0

@wokawka我想我应该补充一点,我没有在C#中实现这个(只有动作脚本),所以我没有任何代码告诉你我知道的作品。但你可以看看这个帖子,它包含一些代码:[link](http://stackoverflow.com/questions/2656835/xna-alpha-blending-to-make-part-of-a-texture-透明) 它归结为您在图像上绘制图像,但是可以使用alphablend选项将其设置为true。这基本上意味着,在将此图像渲染到地形纹理时,任何重叠区域的Alpha通道都将设置为透明。 – 2012-02-13 15:37:33

0

看看我这里的类: http://www.codeproject.com/Articles/328894/XNA-Sprite-Class-with-useful-methods

1.Simply创建Sprite类的一个对象为你的星球
雪碧PlanetSprite =新的雪碧(PlanetTexture2D,新Vector2(// yourPlanet.X,// yourPlanet .Y));

2.当子弹击中了行星,使通过碰撞点的使用“GetCollisionPoint(雪碧B)”方法

-you可以具有Circle.png与透明角
中心的圆texure2d - 或者你可以创建一个圆用数学

3.then创建圆的Sprite对象

4.now使用“GetCollisionArea(雪碧b)(如果你想有弹头威力,这是更好) “得到重叠区域

5.now使用 “ChangeBatchPixelColor(名单像素,Colour彩色)”,其中像素是重叠的区域和颜色是Color.FromNonPremultiplied(0,0,0,0)

- 音符你不需要画出你的圈子,在使用它后,你可以摧毁它,或者将它留下以供进一步使用

+0

“本文仍在撰写中,目前尚未进行一般查看。” – JensB 2012-02-14 08:05:53

+0

哦,对此,请给我你的电子邮件,我会发送给你的课程,我的电子邮件是[email protected],如果你不想发布你的。 – 2012-02-14 09:52:23