我遇到了一些渲染具有8位alpha通道的纹理的麻烦 - 也就是说,它被平铺为1位而glBlendFunc()似乎没有做任何事情。
这是即时模式调用:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glBegin(GL_QUADS);
{
glTexCoord2f(0, 0);
glVertex2f(0, 0);
glTexCoord2f(1, 0);
glVertex2f(356, 0);
glTexCoord2f(1, 1);
glVertex2f(356, 356);
glTexCoord2f(0, 1);
glVertex2f(0, 356);
}
glEnd();
毋庸置疑,有各种各样的OpenGL状态已经在幕后设置,显然其中一个
是否有任何我不知道会影响混合阶段的状态?
我的blendfunc是否合适?从我看过的互联网页面看起来似乎是正确的 - 但是我在GDEBugger中检查了纹理,所以图像肯定加载了8位alpha通道,以及尝试没有alpha通道和一位的图像alpha通道。
非常感谢任何帮助!
编辑:
回答答案:我正在使用SOIL图像加载库,我将查看它的来源,看看它是如何做的。现在,我只是在已经渲染的场景上渲染这个图像 - 它绝对不会面临深度问题 - 事实上深度缓冲测试已经关闭。
答案 0 :(得分:1)
最好使用混合函数(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)实现透明度,其中基元从最远到最近排序。
我会检查以确保您的多边形排序回到前面,否则混合将产生不正确的效果。
我还要确保你在加载纹理时调用glTexImage2D正在使用GL_RGBA或GL_BGRA。
编辑:
另外,glEnable(GL_ALPHA_TEST)并记得使用glAlphaFunc设置你的alpha函数。
答案 1 :(得分:0)
您没有发布另一个重要部分,那就是您如何创建和配置纹理。我认为问题出在那里,而不是你发布的代码。
为了使混合在上述情况下有效,您必须在纹理中启用Alpha通道。