Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 制造一个像Terraria这样的照明系统?_C#_Xna_Lighting_Light - Fatal编程技术网

C# 制造一个像Terraria这样的照明系统?

C# 制造一个像Terraria这样的照明系统?,c#,xna,lighting,light,C#,Xna,Lighting,Light,我试图使我的照明类似于Terria的,块照明。现在,我知道了如何使块变暗,我可以将块指定给特定的灯光级别,但是,我如何制作一个实际的灯光实体,它以圆形(也可以是菱形)发光? 非常感谢您的帮助,如果我的问题不清楚,请随时提问。基本2D照明非常简单。只需检查从块到灯光的距离,并使用该值缩放灯光。 这是一件非常简单的事情,因为Spritebatch.Draw有一个很好的颜色参数 可以使用伪函数 distance = (block.position - light.position). Length(

我试图使我的照明类似于Terria的,块照明。现在,我知道了如何使块变暗,我可以将块指定给特定的灯光级别,但是,我如何制作一个实际的灯光实体,它以圆形(也可以是菱形)发光?
非常感谢您的帮助,如果我的问题不清楚,请随时提问。

基本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)?