在Texture2D中切孔

时间:2012-02-13 08:26:23

标签: c# xna texture2d

我想知道如何从Texture2D中删除部分纹理。 我有一个简单的游戏,当一颗子弹击中它“挖掘”进入这个星球时,我想要一块一块地炸毁一颗行星。

物理学已经开始工作但我仍然坚持如何正确地切割纹理。

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

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

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

3 个答案:

答案 0 :(得分:4)

在对主题进行了大量的谷歌搜索后,似乎最好和最快的方法来实现我想要的效果是使用像素着色器。

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

着色器的思想是遍历原始纹理中的每个像素,并检查灰度图像中每个像素的黑色在同一坐标上的颜色。灰度图像中的像素越黑,原始纹理中的像素的α值(更可见)变得越高。由于所有这些都是在GPU上完成的,因此速度非常快,让CPU准备好为游戏制作实际的逻辑。

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

我找到了一个MSDN示例,其中包含XNA 4的工作源代码(cat示例):

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

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

答案 1 :(得分:0)

这样做的好方法是在行星纹理上使用alphablend渲染“洞纹理”。可以把它想象成在原始纹理上绘制一个隐形圈。 看一下这个帖子,找到一些不错的链接worms-style-destructible-terrain

为了达到你的棕色边缘我猜你需要采取类似的方法。首先使用半径10px渲染到地形的洞。然后从同一原点渲染另一个圆,但半径略大,比如12px。然后,您需要将此圆设置为混合模式,从而产生棕色。

答案 2 :(得分:0)

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

1.只为你的星球创建一个Sprite类对象    Sprite PlanetSprite = new Sprite(PlanetTexture2D,new Vector2(// yourPlanet.X,// yourourPlanet.Y));

2.当子弹击中行星时,使用“GetCollisionPoint(Sprite b)”方法在碰撞点中心做一个圆形纹理二维

- 你可以拥有一个带透明角落的Circle.png - 或者您可以使用数学创建一个圆(如果你想拥有子弹力,那就更好了)

3.然后创建圆圈的Sprite对象

4.现在使用“GetCollisionArea(Sprite b)”来获取重叠区域

5.现在使用“ChangeBatchPixelColor(列表像素,颜色)”,其中像素是重叠区域,颜色是Color.FromNonPremultiplied(0,0,0,0)

- 注意你根本不需要绘制你的圆圈,使用它之后就可以将它摧毁,或留待它进一步使用