XNA(通过GPU)添加“火山口”效果的火山口


11

我目前正在XNA中进行2D“蠕虫”克隆,其功能之一是“可变形”地形(例如,当火箭击中该地形时,会发生爆炸,并且大部分地形消失了)。

我当前的操作方式是使用接近中心的“红色”值逐渐升高的纹理。我循环遍历“变形”纹理的每个像素,如果当前像素与地形像素重叠并且具有足够高的红色值,则将表示地形的颜色阵列修改为透明。如果当前像素的Red值不够高,我将使地形颜色变黑(红色值越接近阈值,它越黑)。在此操作结束时,我使用SetData更新了地形纹理。

我意识到这不是一个好方法,不仅因为我已经阅读了有关管道停顿的知识,而且还因为如果同时添加大量的陨石坑,它可能会变得很漫长。我想在GPU上重新制作Crater Generation,而不是在目标和要修改的纹理之间使用“渲染目标”“渲染”。那不是问题,我知道该怎么做。问题是我不知道如何使用这种方法保持刻录效果。

现在是刻录效果的样子:

烧伤效果

是否有人知道我将如何创建类似的刻录效果(使形成的弹坑周围的边缘变暗)?我对Shaders完全不熟悉,但是如果需要它的话,如果有人指导我完成操作,我将非常感激。如果还有其他方法也很好。


Answers:


7

您可以执行的一种方法类似于您一直在执行的操作。具有“损坏”纹理和实际的背景纹理,但是不必每次都复制数据,只需将两者保持为两个单独的纹理即可。

爆炸时,在“损坏”纹理上画一个圆圈,该边缘的边缘稍微透明。这将是“烧伤”区域。

每当您绘制地形时,都给GPU提供两个纹理,并让着色器将背景像素的颜色(.rgb)乘以1-损坏纹理的alpha值。摆脱全黑像素(将其alpha设置为0,或者也可以将其乘以alpha(.rgba而不是.rgb),具体取决于您是否想要半透明的焦化区域),瞧!

我怀疑这是最好的解决方案,但它与您之前做过的工作相当相似,可能会使传输变得更容易。您可能还可以通过传入Vector3的数组(x,y,radius)并根据这些爆炸点在着色器中进行一些数学运算来避免,但我不确定这样做的效率。

希望这可以帮助!


谢谢!正如您所说,这也是一种很酷的方法,类似于我现在正在做的事情。我对HLSL一无所知,但我一定会对其进行调查。有人告诉我我可以做的另一种方法是在接近火山口边缘时将其变黑,但我也会尝试这种方法。
Benixo 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.