在XNA中点亮2D贴图

本文关键字:2D 贴图 XNA | 更新日期: 2023-09-27 18:07:53

我有一个快速的问题给那些熟悉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. 我如何结合光和纹理来获得看起来像在光的颜色下的纹理?

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

在XNA中点亮2D贴图

您可能不需要整体/多值- 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之间的转换。

当你绘制你的贴图时,你可以使用SpriteBatch的颜色参数——基本上把它设置成你的浅色,它应该在绘制贴图时自动进行颜色乘法。如果你想要比你的贴图(如Terraria)更小的照明单元,你可能需要编写一个自定义着色器,这是更复杂的,但如果你想要学习的话,知道它是有用的。