【问题标题】:Making a lightsystem like Terraria?制作像泰拉瑞亚这样的灯光系统?
【发布时间】:2011-11-22 00:17:11
【问题描述】:

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

【问题讨论】:

    标签: c# xna lighting light


    【解决方案1】:

    基本的 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 通道中为 1 个像素。然后在第二遍中进行照明计算并存储在 RGB 中。然后第三遍,对于每个块,采用 n*n 的网格,并找到所有非 alpha 值(类似模糊的算法?),将 alpha 更改为结果。最后,将该渲染目标合并回您的场景。当然,渲染目标应该比块的数量略大,以允许只占屏幕一半的块。
    【解决方案2】:

    我正在开发一款具有类似光照模型的游戏,我们的做法是这样的:

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

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

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

    【讨论】:

    • 只是想知道,您是否手动将纹理绘制为四边形? (即不使用 SpriteBatch)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多