XNA添加具有“刻录”效果的陨石坑(通过GPU)

时间:2011-04-07 16:09:28

标签: xna effects textures

我目前正在研究XNA中的2D“蠕虫”克隆,其中一个特征是“可变形”地形(例如,当火箭撞击地形时,会发生爆炸,一大块地形消失)。

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

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

以下是烧伤效果现在的样子:

Burn Effect http://i52.tinypic.com/2h6f2nt.png

是否有人知道如何创建类似的刻录效果(使形成的凹坑周围的边缘变暗)?我对Shaders完全不熟悉,但如果它需要它,如果有人带我了解如何去做,我会非常感激。如果有任何其他方式也会很棒。

1 个答案:

答案 0 :(得分:8)

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

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

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

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

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

  1. 第一个选项是进行边缘检测。检查所有4个方向的几个像素,看看像素是否在边缘。如果是这样,它需要进行刻录,例如,将其乘以到边缘的距离(或您喜欢的任何其他功能)
  2. 另一种方式与第一种方式非常相似,但分两步进行。首先,您执行相同类型的边缘检测,但是您将边缘保存在单独的纹理中。现在,当您绘制纹理时,可以覆盖边缘。所以它只是立刻拉开了地面。
  3. 第二个选项的主要区别在于,您还可以选择仅绘制正常地面,而不是在渲染时调整地面纹理中的像素。

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

    关键词:香椿阴影,HLSL,后期效果,边缘检测,图像处理 推荐阅读:http://rbwhitaker.wikidot.com/xna-tutorials