制作像Terraria这样的灯系统?

时间:2011-11-20 21:24:14

标签: c# xna lighting light

我正在努力让我的灯光类似于Terraria的灯光照明。现在,我知道如何使块更暗,我可以将块分配给某个光级,但是,我如何制作一个实际的光实体,它发出圆形的光(也可以是菱形)? 非常感谢帮助,如果我不清楚我的问题,请随时提出。

2 个答案:

答案 0 :(得分:5)

基本的2D照明非常简单。只需从您的区块到您的灯光进行距离检查,并使用该值来缩放光线。 这是你可以做的相当简单的事情,因为Spritebatch.Draw有一个很好的Color tint参数[link]

伪函数可以是

distance =  (block.position - light.position). Length();
lightPower = distance / light.MaxDistance;
finalTint = light.Color * lightPower;
Render Block, with finalTint

对于更漂亮的灯光,您可以用更平滑的效果替换“distance / light.MaxDistance”。 如果您还希望灯光通过像Terraria这样的几个块,您可以计算块和光源之间的所有块。按照这个数量缩小你的lightPower,你会得到像Terraria一样的效果。

当然,这是一种非优化的方式,但应该有效。

然而,最新的Terraria版本似乎具有平滑的每像素照明,而不是每个块[preview]。为此,我假设他们使用第二个渲染目标和/或像素着色器来保持快速性能。如果你不熟悉渲染管道,这可能有点困难。

希望这有帮助!

答案 1 :(得分:1)

我正在开发一款采用类似照明模式的游戏,我们这样做是这样的:

  1. 将没有光照的场景绘制到渲染目标(称为“场景缓冲区”)
  2. 将场景的灯光(以任何所需形状的灰度渐变表示)绘制到第二个渲染目标(称为“光照贴图”)
  3. 将场景缓冲区绘制到屏幕上,将光照贴图作为参数传递给像素着色器
  4. 在像素着色器中,查询每个像素的光照贴图值,并根据需要向上或向下调整最终像素的颜色。
  5. 这也使您能够拥有彩色照明;您所要做的就是将渲染的光渐变色调到光照贴图。请记住使用添加剂α混合。

    这种方法的缺点是它相当幼稚,并没有提供遮挡灯光的简单方法(也就是说,它们穿过墙壁)。在我们的例子中,这不是问题;你可能会另有决定。