OpenGL - 使用纹理的alpha通道和“全局”不透明度级别

时间:2010-08-29 10:10:53

标签: opengl

我正试图获得一个相当简单的效果;我希望我的精灵能够使用GL使用的alpha通道(即,半透明的图像部分,但不是全部)以及整个精灵都有一个“不透明”级别,影响整个精灵。

我有后一部分,这很简单,使用GL_MODULATE并传递color4d(不透明度,不透明度,不透明度,不透明度)。像梦一样工作。

但问题出在第一部分;部分半透明的图像。我以为我可以扔出一个glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);并启用混合,但遗憾的是它没有这样做。它似乎做的是“美白”有问题的图像的颜色,而不是使其半透明。在它下面传递的任何其他精灵都表现得好像是一块坚固的颜色,直接切断。

作为参考,我已禁用光照,z缓冲,颜色材质和alpha测试。遮阳模型是否平整,以防万一。但除此之外,我正在使用默认的ortho设置。我正在使用teximage2d来处理有问题的纹理,我确信格式和GL_RGBA都设置正确。

如何在混合过程中让GL考虑纹理的alpha通道?

2 个答案:

答案 0 :(得分:1)

最简单,最快速的解决方案是使用片段着色器。

uniform float alpha;
uniform sampler2D texture;
main(){
    gl_FragColor = texture2d(texture, gl_TexCoords);
    gl_FragColor.a *= alpha;
}

答案 1 :(得分:1)

  • GL_MODULATE是告诉GL使用纹理alpha作为片段的最终alpha的方法(它也是默认值)。
  • 关于如何在混合阶段使用生成的alpha,您的混合也是正确的。

所以问题出在其他地方......你的描述听起来好像你实际上没有禁用Z-test,而且你不会将你的精灵渲染回来。如果你将精灵画回到前面,GL中的Alpha混合只会做你想要的。否则,精灵会以错误的顺序混合,这不会产生正确的输出。

用你所观察到的图片验证这一点会更容易。