C# 在XNA中照明二维平铺贴图

C# 在XNA中照明二维平铺贴图,c#,colors,xna,2d,lighting,C#,Colors,Xna,2d,Lighting,我有一个快速的问题要问那些熟悉计算机图形学中的XNA和颜色理论的人。我正在制作一个瓷砖游戏(有点像Terraria),我想知道如何将每个瓷砖的照明应用到场景中。彩色灯光是这个游戏的必备品,现在我通过使用4个2D字节数组,存储整体灯光和3种不同的颜色量,了解了这一点。绘制瓷砖时,它会将特定瓷砖的纹理应用到其上,但是如何根据3个颜色值和整体照明在同一瓷砖上应用颜色呢 现在,这是我的颜色生成函数: public Color GetColorAt(int x, int y) { byte r =

我有一个快速的问题要问那些熟悉计算机图形学中的XNA和颜色理论的人。我正在制作一个瓷砖游戏(有点像Terraria),我想知道如何将每个瓷砖的照明应用到场景中。彩色灯光是这个游戏的必备品,现在我通过使用4个2D字节数组,存储整体灯光和3种不同的颜色量,了解了这一点。绘制瓷砖时,它会将特定瓷砖的纹理应用到其上,但是如何根据3个颜色值和整体照明在同一瓷砖上应用颜色呢

现在,这是我的颜色生成函数:

public Color GetColorAt(int x, int y)
{
    byte r = _rMap[x, y]; //Red light
    byte g = _gMap[x, y]; //Green light
    byte b = _bMap[x, y]; //Blue light
    byte mul = _lightMap[x, y]; ///Overall light

    return new Color(r * mul, g * mul, b * mul, 1);
}
作为色彩理论的新手,我不知道我是否以正确的方式来处理这个问题。我的照明系统使用细胞算法,减少并扩展到所有相邻的瓷砖。如果它减少了每个瓷砖的颜色值,我是否需要从整体灯光值开始

此外,当涉及到混合瓷砖纹理和灯光以获得结果时,我是否使用加法、乘法或其他计算方法

TL;博士: 1.考虑到每个瓷砖之间的光线减少,上面的代码块是否有效? 2.如何将灯光和纹理组合在一起,以获得类似灯光颜色下的纹理


感谢您的帮助,我没有颜色组合的经验。

您可能不需要总体/mul值-R、G和B足以表示浅色和强度

您使用的是“byte”,但从数学上讲,使用0.0到1.0之间的“float”值可能更容易

在浮点表示法中,
R=1,G=1,B=1
为白色,
R=0.5,G=0.5,B=0.5
为中灰色,
R=0,G=0,B=0
为黑色,等等。然后,您可以直接将颜色相乘,而无需在0..255字节范围之间进行转换


在绘制瓷砖时,可以使用SpriteBatch的颜色参数-基本上将其设置为灯光颜色,并在绘制瓷砖时自动执行颜色倍增。如果您想要比瓷砖更小的照明单元(如Terraria),您可能需要编写一个自定义着色器,该着色器更为复杂,但有助于了解您是否准备进行一些研究。

在提出此问题之前,您做了哪些研究?感谢您回答我的问题。我觉得我可能不需要mul值,在问了我的一个朋友后,她说她认为我也不需要,但不确定。至于每个街区的多个照明瓷砖,比如Terraria,我甚至不太精通着色器,所以我想我会在互联网上查找。