XNA添加弹坑(通过GPU)时,使用;“燃烧”;影响

XNA添加弹坑(通过GPU)时,使用;“燃烧”;影响,xna,effects,textures,Xna,Effects,Textures,我目前正在XNA中开发一个2D“蠕虫”克隆,其中一个功能是“可变形”地形(例如,当火箭击中地形时,会发生爆炸,一块地形消失) 我目前是如何做到这一点的,是通过使用一个纹理,当它接近中心时,它的红色值会逐渐升高。我循环遍历“变形”纹理的每个像素,如果当前像素与地形像素重叠并且具有足够高的红色值,我将表示地形的颜色数组修改为透明。如果当前像素没有足够高的红色值,我会将地形颜色变黑(红色值越接近阈值,颜色越黑)。在该操作结束时,我使用SetData更新地形纹理 我意识到这不是一个很好的方法,不仅因为我

我目前正在XNA中开发一个2D“蠕虫”克隆,其中一个功能是“可变形”地形(例如,当火箭击中地形时,会发生爆炸,一块地形消失)

我目前是如何做到这一点的,是通过使用一个纹理,当它接近中心时,它的红色值会逐渐升高。我循环遍历“变形”纹理的每个像素,如果当前像素与地形像素重叠并且具有足够高的红色值,我将表示地形的颜色数组修改为透明。如果当前像素没有足够高的红色值,我会将地形颜色变黑(红色值越接近阈值,颜色越黑)。在该操作结束时,我使用SetData更新地形纹理

我意识到这不是一个很好的方法,不仅因为我读到了关于管道停顿之类的东西,而且因为如果同时添加大量的火山口,它可能会变得相当滞后。我想在GPU上重新生成陨石坑,而不是在目标和要修改的纹理之间使用渲染目标“乒乓”。这不是问题,我知道怎么做。问题是我不知道如何使用这种方法保持我的烧伤效果

下面是燃烧效果现在的样子:


有人知道我将如何创造类似的燃烧效果(使形成的陨石坑周围的边缘变暗)吗?我对着色器完全不熟悉,但如果需要的话,如果有人教我如何做,我会非常感激。如果还有其他方法也很好。

听起来你的方法很好。但是你用手做了很多事情,这也可以通过绘制精灵和应用正确的公式来完成

例如:
假设您的地形保存到纹理alpha通道中的巨型纹理中。1是地形,0什么都不是

发生爆炸,地形必须变形。只需在纹理上绘制一个黑色透明球体(或爆炸区域),即可轻松更新纹理。地形消失了,因为alpha值是黑色球体的0。你的纹理现在是最新的,一切都是由spriteBatch完成的。什么都不需要检查

我不知道你是否也想要一个解决方案,但现在你有了

对于燃烧效果
现在我们在纹理中有了地形,我们可以通过使用着色器(就像你说的那样)对图形进行后期效果。着色器获得纹理的alpha通道,现在可以执行不同的操作以获得燃烧效果

  • 第一种选择是进行边缘检测。在所有4个方向上检查几个像素,看看像素是否位于边缘。如果是这样,它需要执行“烧录”,例如,将其与到边的距离相乘(或任何其他您喜欢的函数)
  • 另一种方法与第一种方法非常相似,但分两步进行。首先,执行相同类型的边缘检测,但将边缘保存在单独的纹理中。现在,在绘制纹理时,可以覆盖边。因此,这与立即绘制地面是完全相同的
  • 第二个选项的主要区别在于,您也可以选择仅绘制法线地面,而不在渲染时调整地面纹理中的像素

    我知道这是一个很长的故事,但这是一个很好的技术。看看卡通着色器,它们也可以进行边缘检测,即使是3D的

    关键词:香椿着色、HLSL、后期效果、边缘检测、图像处理。
    建议阅读: