在OpenGL中更改纹理不透明度

zou*_*oul 11 iphone opengl-es

希望这是一个简单的问题:我有一个OpenGL纹理,并希望能够改变它的不透明度,我该怎么做?纹理已经有一个alpha通道,并且混合工作正常,但我希望能够降低整个纹理的不透明度,使其淡入背景.我已经摆弄glBlendFunc,但没有运气 - 似乎我需要类似的东西GL_SRC_ALPHA_MINUS_CONSTANT,这是不可用的.我正在使用OpenGL ES在iPhone上工作.

Dan*_*Dan 16

我不知道OpenGL ES,但在标准的OpenGL中你可以通过在使用之前为纹理声明颜色来设置不透明度:

//          R,   G,   B,   A
glColor4f(1.0, 1.0, 1.0, 0.5);
Run Code Online (Sandbox Code Playgroud)

该示例将为您提供50%的alpha而不会影响纹理的颜色.通过调整其他值,您也可以移动纹理颜色.

  • 这是有效的,因为默认纹理环境设置为GL_MODULATE (3认同)
  • 那么这取决于应用程序,但我通常会使用:glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); (2认同)

NeA*_*RAZ 7

使用纹理合成器.设置纹理阶段以GL_MODULATE在纹理和恒定颜色之间执行操作.然后从代码(glTexEnv,GL_TEXTURE_ENV_COLOR)中更改常量颜色.

就性能而言,这应该是"免费的".在大多数(如果不是全部)图形芯片组合器操作采用相同数量的GPU周期(通常为1),因此仅使用纹理与进行调制操作(或任何其他操作)的成本完全相同.


zou*_*oul 2

谢谢大家的想法。我\xe2\x80\x99都玩过glColor4f和glTexEnv,最后强迫自己仔细阅读glTexEnv联机帮助页。手册页说,在 GL_MODULATE 纹理模式下,结果颜色是通过将传入片段乘以纹理颜色 (C=Cf\xc3\x97Ct) 来计算的,对于 alpha 也是如此。我尝试了 glColor4f(1, 1, 1, opacity) 但这不起作用,但是将所需的不透明度传递给调用的所有四个参数就可以了。(但仍然不确定为什么。)

\n

  • 这让您决定将自己的“答案”标记为已接受的答案? (3认同)
  • 如果您将生成的颜色进行 alphablend 到背景中,或者使用 GL_ONE 参数(而不是 GL_SRC_ALPHA)作为源 alpha 进行 alphablend,这是正常的。在这种情况下,您不需要更改所有颜色组件。 (2认同)