我目前正在研究XNA中的2D“蠕虫”克隆,其中一个特征是“可变形”地形(例如,当火箭撞击地形时,会发生爆炸,一大块地形消失)。
我目前这样做的方法是使用一个接近中心的红色值逐渐变高的纹理。我循环遍历“变形”纹理的每个像素,如果当前像素与地形像素重叠并且具有足够高的红色值,我将表示地形的颜色数组修改为透明。如果当前像素的红色值不够高,则会使地形颜色变黑(红色值越接近阈值,颜色越黑)。在这个操作结束时,我使用SetData来更新我的地形纹理。
我意识到这不是一个好方法,不仅因为我已经阅读过关于管道停滞等等,而且因为如果同时添加大量的陨石坑,它会变得非常滞后。我想在GPU上重新制作我的Crater Generation,而不是在目标和要修改的纹理之间使用渲染目标“ping-ponging”。这不是问题,我知道该怎么做。问题是我不知道如何使用这种方法保持我的刻录效果。
以下是烧伤效果现在的样子:
Burn Effect http://i52.tinypic.com/2h6f2nt.png
是否有人知道如何创建类似的刻录效果(使形成的凹坑周围的边缘变暗)?我对Shaders完全不熟悉,但如果它需要它,如果有人带我了解如何去做,我会非常感激。如果有任何其他方式也会很棒。
答案 0 :(得分:8)
听起来你的方式很好。但是你手工做了很多事情,也可以通过绘制精灵并应用正确的公式来完成。
例如:
假设您的地形被保存到纹理的Alpha通道中的巨型纹理中。 1是地形,0是什么。
发生爆炸,地形必须变形。只需在纹理上绘制黑色透明球体(或爆炸区域)即可轻松更新纹理。地形消失了,因为黑色球体的alpha值为0。你的纹理现在是最新的,一切都是由spriteBatch完成的。没有必要检查。
我不知道你是否也想要一个解决方案,但现在你有一个。
对于燃烧效果
现在我们在纹理中有了地形,我们可以使用着色器对绘图进行后期效果(就像你说的那样)。着色器获得纹理的alpha通道,现在可以执行不同的操作来获得刻录效果。
第二个选项的主要区别在于,您还可以选择仅绘制正常地面,而不是在渲染时调整地面纹理中的像素。
我知道这是一个很长的故事,但这是一个很好的技巧。看看toon着色器,它们也会进行边缘检测,即使它是3D。
关键词:香椿阴影,HLSL,后期效果,边缘检测,图像处理 推荐阅读:http://rbwhitaker.wikidot.com/xna-tutorials