0

对于那些非常了解计算机图形学中的 XNA 和色彩理论的人,我有一个简短的问题。我正在制作一个瓷砖游戏(有点像泰拉瑞亚),我想知道如何将每个瓷砖照明应用到场景中。对于这个游戏来说,彩色光照是必须的,而现在我通过 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. 如何将光和纹理结合起来,以获得在光的颜色下看起来像它的纹理?

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

4

1 回答 1

0

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

您使用的是“字节”,但在数学上使用 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 的颜色参数 - 基本上将其设置为您的浅色,它应该在绘制瓷砖时自动进行颜色相乘。如果您想要比您的瓷砖更小的照明单元(如泰拉瑞亚),您可能需要编写一个自定义着色器,这涉及更多 - 但对于了解您是否准备进行一些学习很有用。

于 2013-04-08T06:32:33.253 回答