OpenGL多位Alpha纹理

时间:2011-01-13 15:08:34

标签: c++ opengl glblendfunc

我遇到了一些渲染具有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图像加载库,我将查看它的来源,看看它是如何做的。现在,我只是在已经渲染的场景上渲染这个图像 - 它绝对不会面临深度问题 - 事实上深度缓冲测试已经关闭。

2 个答案:

答案 0 :(得分:1)

  

最好使用混合函数(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)实现透明度,其中基元从最远到最近排序。

我会检查以确保您的多边形排序回到前面,否则混合将产生不正确的效果。

我还要确保你在加载纹理时调用glTexImage2D正在使用GL_RGBA或GL_BGRA。

编辑:

另外,glEnable(GL_ALPHA_TEST)并记得使用glAlphaFunc设置你的alpha函数。

http://www.gamedev.net/topic/105082-glalphafunc/

答案 1 :(得分:0)

您没有发布另一个重要部分,那就是您如何创建和配置纹理。我认为问题出在那里,而不是你发布的代码。

为了使混合在上述情况下有效,您必须在纹理中启用Alpha通道。