1

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

物理学已经开始工作了,但我被困在如何正确切割纹理上。

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

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

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

4

3 回答 3

4

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

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

着色器的想法是遍历原始纹理中的每个像素,并检查灰度图像中每个像素在同一坐标处的黑度。灰度图片中的像素越黑,原始纹理中的像素的 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/

于 2012-02-14T09:29:00.587 回答
0

这样做的一个好方法是在你的星球纹理之上使用 alphablend 渲染一个“洞纹理”。把它想象成在你的原始纹理上画一个隐形圆圈。看看这个线程,了解一些不错的链接worms-style-destructible-terrain

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

于 2012-02-13T10:02:44.697 回答
0

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

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

2.当子弹击中行星时,使用“GetCollisionPoint(Sprite b)”方法以碰撞点的中心制作一个圆形texure2d

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

3.然后创建一个你圈子的Sprite对象

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

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

-注意你根本不需要画你的圆圈,使用后你可以销毁它,或者留下它以供进一步使用

于 2012-02-14T07:11:51.653 回答