我想知道如何从Texture2D中删除部分纹理。 我有一个简单的游戏,当一颗子弹击中它“挖掘”进入这个星球时,我想要一块一块地炸毁一颗行星。
物理学已经开始工作但我仍然坚持如何正确地切割纹理。
我需要创建一个函数,它将Texture2D作为一个位置,将radius作为输入,并返回新的Texture2D。
这是我想要完成之前和之后的Texture2D的示例。 http://img513.imageshack.us/img513/6749/redplanet512examplesmal.png
另请注意,我在火山口洞周围画了一个薄薄的棕色边框。如果这是可能的话,这将是一个很大的好处。
答案 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)
- 注意你根本不需要绘制你的圆圈,使用它之后就可以将它摧毁,或留待它进一步使用