【问题标题】:OpenGL ES - Change hue of colors in textureOpenGL ES - 改变纹理颜色的色调
【发布时间】:2010-06-19 02:08:28
【问题描述】:

我正在为 iPhone 使用 OpenGL ES 开发一个简单的 2D 游戏。我的问题是我想使用不同的色调渲染纹理。基本上我想改变我渲染的纹理中颜色的色调。简单地改变 glColor 是行不通的,因为它也会影响图像中没有颜色的部分。有什么想法吗?

【问题讨论】:

  • 你能解释一下为什么你认为 glColor 不起作用吗?你是什​​么意思,“它也会影响图像中没有颜色的部分”
  • 我猜纹理的白色部分应该保持白色,但是纹理的红色部分应该是绿色的。在这种情况下——两个独立的透明纹理怎么样,一个是不应该改变的部分,另一个是你可以用不同的 glColor 设置渲染的?
  • 大卫是正确的。黑色和灰色部分也应该保持黑色和灰色。我使用的纹理是在 3D 程序中预渲染的,渐变从蓝色到白色,因此很难将它们分成两个纹理。

标签: iphone opengl-es


【解决方案1】:

感谢您的澄清,这与我最初的理解相去甚远。请注意,您提供给 OpenGL ES 的纹理已经具有色调,因此您要求的是更改现有色调。

首先,让我回答上述问题:

让我们从纹素需要发生的事情开始。由于 OpenGL 纹理存储为 RGB,要转换纹素的色调,您需要执行 RGB->HSL->apply new hue->RGB。 您可以找到执行 RGB->HSL 和反向转换 here 的实际数学。你想如何选择新的色调,我想你必须填写。

最大的问题是何时应该发生转变。好吧,OpenGL 管道不会让您在读取纹理时进行如此复杂的转换(无论如何,在 ES 1.1 中都没有 -ES 2.0 fragment shaders 会有所帮助,但成本很高)。因此,您必须在 GL ES 纹理管道之外进行所有转换。根据您需要更改色调的频率,我的建议是离线进行(并存储各种主题纹理),或者在将新色调加载到 OpenGL ES 之前按需为新色调计算新纹理。

据我所知,GL ES 1.1 没有任何内置工具可以直接帮助执行此操作。

现在,退后一步,我不确定是什么阻止您分离出 2 个纹理,如果您可以在运行时应用这 2 个纹理。无论纹理是如何生成的,我指出的数学都会将饱和度与亮度分开(理论上,如果我正确理解您的情况,色调应该是恒定的)。在任何输入纹理上进行离线计算应该相当容易?

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 2015-07-06
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多