【问题标题】:Lighting a 2D Tile Map in XNA在 XNA 中点亮 2D 平铺地图
【发布时间】:2013-03-30 01:10:09
【问题描述】:

我有一个问题要问那些熟悉计算机图形学中 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. 如何将光和纹理结合起来,以获得在光的颜色下看起来像它的纹理?

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

【问题讨论】:

  • 在问这个问题之前你做了哪些研究?

标签: c# colors xna 2d lighting


【解决方案1】:

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

【讨论】:

  • 感谢您回答我的问题。我预感到我可能不需要 mul 值,在问了我的一个朋友之后,她说她认为我也不需要它,但不确定。
  • 至于每个方块有多个照明瓦片,比如泰拉瑞亚,我对着色器的了解就更少了,所以我想我会在互联网上四处寻找。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多