【发布时间】:2011-11-22 00:17:11
【问题描述】:
我正在尝试使我的照明类似于泰拉瑞亚的块状照明。现在,我知道如何让方块变暗,我可以将方块分配给特定的光照级别,但是,我将如何制作一个真正的光实体,它会发出圆形的光(也可以是菱形的)? 非常感谢您的帮助,如果我的问题不清楚,请随时提出。
【问题讨论】:
我正在尝试使我的照明类似于泰拉瑞亚的块状照明。现在,我知道如何让方块变暗,我可以将方块分配给特定的光照级别,但是,我将如何制作一个真正的光实体,它会发出圆形的光(也可以是菱形的)? 非常感谢您的帮助,如果我的问题不清楚,请随时提出。
【问题讨论】:
基本的 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 缩小该数量,您将获得与泰拉瑞亚相同的效果。
当然,这是一种非优化的方式,但应该可以。
然而,最新的泰拉瑞亚版本似乎具有平滑的每像素光照而不是每块[preview]。为此,我假设他们使用了第二个渲染目标和/或像素着色器来保持快速性能。如果您不熟悉渲染管道,这可能会有点困难。
希望这会有所帮助!
【讨论】:
我正在开发一款具有类似光照模型的游戏,我们的做法是这样的:
这也使您能够拥有彩色照明;您所要做的就是对渲染到光照贴图的光照渐变进行着色。请记住使用加法 Alpha 混合。
这种方法的缺点是它相当幼稚,并且没有提供简单的方法来遮挡灯光(也就是说,它们穿过墙壁)。在我们的例子中,这不是问题。您可能会做出其他决定。
【讨论】: