【问题标题】:XNA Adding Craters (via GPU) with a "Burn" EffectXNA 添加带有“燃烧”效果的陨石坑(通过 GPU)
【发布时间】:2011-07-31 20:18:16
【问题描述】:

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

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

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

现在的燃烧效果如下所示:

有人知道如何创建类似的燃烧效果(使形成的火山口周围的边缘变暗)吗?我对着色器完全不熟悉,但如果需要它,如果有人指导我如何做到这一点,我将非常感激。如果还有其他方法也很好。

【问题讨论】:

    标签: xna effects textures


    【解决方案1】:

    听起来你做得很好。但是您需要手动完成很多事情,这也可以通过绘制精灵并应用正确的公式来完成。

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

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

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

    为了燃烧效果
    现在我们在纹理中拥有了地形,我们可以使用着色器对绘图进行后期效果(就像你说的那样)。着色器获取纹理的 Alpha 通道,现在可以做不同的事情来获得我们的燃烧效果。

    1. 第一个选项是进行边缘检测。检查所有 4 个方向的几个像素,看看像素是否在边缘。如果是这样,它需要进行刻录,例如,将其乘以到边缘的距离(或您喜欢的任何其他函数)
    2. 另一种方法与第一种方法非常相似,但分两步完成。首先,您执行相同类型的边缘检测,但将边缘保存在单独的纹理中。现在,当您绘制纹理时,您可以覆盖边缘。所以这与一次绘制地面完全一样。

    第二个选项的主要区别在于,您也可以选择仅绘制法线地面,而不是在渲染时调整地面纹理中的像素。

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

    关键字:卡通着色、HLSL、后期效果、边缘检测、图像处理。
    推荐阅读:http://rbwhitaker.wikidot.com/xna-tutorials

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 2017-01-16
      • 2013-05-03
      • 1970-01-01
      • 2017-04-09
      • 2013-02-17
      相关资源
      最近更新 更多