在XNA中照明2D平铺贴图

时间:2013-04-08 03:38:21

标签: c# colors xna 2d lighting

对于那些熟悉计算机图形学中的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; DR:  1.考虑到每个瓷砖之间的光线减少,代码是否在上面工作?  2.如何组合光线和纹理以获得在光的颜色下看起来像它的纹理?

感谢您的帮助,我没有使用Color组合的经验。

1 个答案:

答案 0 :(得分:0)

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

您正在使用“byte”,但在数学上使用“float”值可能更容易,范围从0.0到1.0。

在浮点表示中,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),你可能需要编写一个更加复杂的自定义着色器 - 但是有用的是知道你是否正在学习。