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

有帮助吗?

解决方案 3

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

其他提示

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

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

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

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

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

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

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

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

的glBlendFunc
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA),

你可能能够“轻松”地并且 - 更重要的是,廉价地 - 达到预期的效果。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top