2

我正在尝试使我的照明类似于泰拉瑞亚的块状照明。现在,我知道如何让方块变暗,我可以将方块分配给特定的光照级别,但是,我将如何制作一个真正的光实体,它会发出圆形的光(也可以是菱形的)?非常感谢您的帮助,如果我的问题不清楚,请随时提问。

4

2 回答 2

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”替换为更平滑的效果。如果您还希望灯光像泰拉瑞亚那样穿过几个方块,您可以计算方块和光源之间的所有方块。将您的 lightPower 缩小该数量,您将获得与泰拉瑞亚相同的效果。

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

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

希望这可以帮助!

于 2011-11-21T00:11:47.703 回答
1

我正在开发具有类似照明模型的游戏,我们这样做的方式是:

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

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

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

于 2011-11-21T16:17:11.593 回答