在OpenGL中更改纹理不透明度

时间:2008-11-03 14:21:56

标签: iphone opengl-es

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

8 个答案:

答案 0 :(得分:16)

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

//          R,   G,   B,   A
glColor4f(1.0, 1.0, 1.0, 0.5);

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:2)

谢谢大家的想法。我和glColor4f以及glTexEnv一起玩过,最后强迫自己仔细阅读glTexEnv手册。该联机帮助页说明在GL_MODULATE纹理模式中,通过将输入片段乘以纹理颜色(C = Cf×Ct)来计算得到的颜色,同样适用于alpha。我尝试了glColor4f(1,1,1,不透明度)并且没有用,但是将所需的不透明度传递到调用的所有四个参数中就可以了。 (但仍不确定为什么。)

答案 3 :(得分:2)

基本上你有两个选择:使用glTexEnv为你的纹理使用GL_MODULATE并使用glColor4 *指定颜色,并为alpha通道使用非不透明级别。请注意,首次加载纹理时,glTexEnv应仅发出一次。如果您在顶点属性中指定颜色,则此方案将不起作用。这些将覆盖您可能设置的任何glColor4 *颜色。在这种情况下,您可能需要使用以下两个选项之一:使用纹理合并器(高级主题,在固定管道中使用不太好),或“手动”更改每个顶点的顶点颜色属性(可能不合适较大的网格)。

答案 4 :(得分:2)

如果您使用的是现代OpenGL。

您可以在片段着色器中执行此操作:

void main()
{
     color = vec4(1.0f, 1.0f, 1.0f, OPACITY) * texture(u_Texture, TexCoord);
}

这允许您将不透明度值应用于纹理,而不会破坏混合。

答案 5 :(得分:1)

最直接的方法是动态更改纹理的alpha值。由于您在某个时刻告诉OpenGL有关纹理的信息,因此您将在内存中使用位图。所以只需将纹理重新绑定到相同的纹理ID。如果您没有在内存中(由于空间限制,因为您在ES上),您可以使用 glGetTexImage()再次将纹理检索到缓冲区。那是干净的解决方案。

但是,保存/检索操作有点贵,因此您可能需要另一种解决方案。考虑到这一点,您可以使用显示纹理的几何体后面的几何体,或者只是处理保持纹理的几何体的材质/颜色。您可能希望对背面几何体进行一些叠加混合。使用

的glBlendFunc
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA),

你可能能够“轻松”地 - 更重要的是,便宜地 - 达到预期的效果。

答案 6 :(得分:1)

您最有可能使用cg将图像转换为纹理。使用cg时,alpha是预乘的,因此你必须使用alpha4作为color4f函数的rgba。

答案 7 :(得分:0)

我怀疑你有黑色背景,因此通过减少每种颜色的数量,你有效地将颜色淡化为黑色。