C# 制造一个像Terraria这样的照明系统?
我试图使我的照明类似于Terria的,块照明。现在,我知道了如何使块变暗,我可以将块指定给特定的灯光级别,但是,我如何制作一个实际的灯光实体,它以圆形(也可以是菱形)发光?C# 制造一个像Terraria这样的照明系统?,c#,xna,lighting,light,C#,Xna,Lighting,Light,我试图使我的照明类似于Terria的,块照明。现在,我知道了如何使块变暗,我可以将块指定给特定的灯光级别,但是,我如何制作一个实际的灯光实体,它以圆形(也可以是菱形)发光? 非常感谢您的帮助,如果我的问题不清楚,请随时提问。基本2D照明非常简单。只需检查从块到灯光的距离,并使用该值缩放灯光。 这是一件非常简单的事情,因为Spritebatch.Draw有一个很好的颜色参数 可以使用伪函数 distance = (block.position - light.position). Length(
非常感谢您的帮助,如果我的问题不清楚,请随时提问。基本2D照明非常简单。只需检查从块到灯光的距离,并使用该值缩放灯光。 这是一件非常简单的事情,因为Spritebatch.Draw有一个很好的颜色参数 可以使用伪函数
distance = (block.position - light.position). Length();
lightPower = distance / light.MaxDistance;
finalTint = light.Color * lightPower;
Render Block, with finalTint
要获得更漂亮的灯光,可以使用更平滑的效果替换“distance/light.MaxDistance”。
如果您还希望灯光穿过像Terraria这样的几个块,则可以计算块和光源之间的所有块。将你的光功率降低这个数量,你就会得到和Terraria一样的效果
当然,这是一种未经优化的方法,但应该有效
然而,最新的Terraria版本似乎具有平滑的每像素照明,而不是每块。为此,我假设他们使用了第二个渲染目标和/或像素着色器来保持快速性能。但是,如果您不熟悉渲染管道,这可能有点困难
希望这有帮助 我正在开发一款具有类似照明模型的游戏,我们的工作方式如下:
这种方法的缺点是它相当幼稚,并且没有提供简单的方法来阻挡灯光(也就是说,灯光穿过墙壁)。在我们的例子中,这不是一个问题;您可能会做出相反的决定。使用着色器的另一种简单方法:将场景绘制到渲染目标,其中每个块在alpha通道中为1个像素。然后在第二遍中进行照明计算并存储在RGB中。然后第三遍,对于每个块,取一个n*n的网格,找到所有非alpha值(类似模糊的算法?),将alpha更改为结果。最后,将该渲染目标合并回场景。当然,rendertarget应该略大于块的数量,以允许屏幕中只有一半的块。只是想知道,您是否手动将纹理绘制为四边形?(即不使用SpriteBatch)?