制作像泰拉瑞亚那样的光系统

本文关键字:系统 泰拉瑞亚 | 更新日期: 2023-09-27 18:15:19

我试图使我的照明类似于Terraria的,块照明。现在,我知道如何让方块变暗,我可以给方块指定一个特定的亮度,但是,我如何制作一个真正的光实体,发出圆形的光(也可以是菱形的)?如果我的问题不清楚,请随时提问。

制作像泰拉瑞亚那样的光系统

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

伪函数可以是

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

对于更好看的光,你可以替换"距离/光"。MaxDistance"具有更平滑的效果。如果你也想让灯光穿过像Terraria这样的几个方块,你可以计算方块和光源之间的所有方块。将你的光能量按一定比例缩小,你就会得到和泰拉瑞亚一样的效果。

当然,这是一种非优化的方式,但应该可以工作。

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

希望这对你有帮助!

我正在制作一款具有类似照明模型的游戏,我们是这样做的:

  1. 绘制场景,没有照明,渲染目标(称为"场景缓冲")
  2. 绘制场景的灯光,表示为任何所需形状的灰度梯度,到第二个渲染目标(称为"灯光图")
  3. 将场景缓冲区绘制到屏幕上,将光照贴图作为参数传递给像素着色器
  4. 在像素着色器中,查询每个像素的光图值,并根据需要调整最终像素的颜色。

这也使您能够有彩色照明;你所要做的就是对渲染到灯光贴图上的灯光渐变进行着色。只要记住使用添加的alpha混合。

这种方法的缺点是它相当幼稚,并且没有提供简单的方法来遮挡光线(也就是说,它们穿过墙壁)。在我们的案例中,这不是问题;