2

我在渲染具有 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 通道和一位的图像阿尔法通道。

任何帮助将不胜感激!


编辑:

回应答案:我正在使用 SOIL 图像加载库,我将查看它的源代码,看看它是如何工作的。现在,我只是在已经渲染的场景上渲染这个图像——它绝对没有遇到深度问题——实际上深度缓冲区测试已经关闭。

4

2 回答 2

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/

于 2011-01-13T15:21:20.057 回答
0

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

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

于 2011-01-13T15:20:03.527 回答