c++ - OpenGL 多位 Alpha 纹理

标签 c++ opengl glblendfunc

我在渲染具有 8 位 alpha channel 的纹理时遇到了一些问题 - 也就是说,它被展平为 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 channel ,以及尝试没有 alpha channel 和一位的图像阿尔法 channel 。

如有任何帮助,我们将不胜感激!


编辑:

作为对答案的回应:我正在使用 SOIL 图像加载库,我将查看它的源代码并了解它是如何工作的。现在,我只是在已经渲染的场景之上渲染此图像 - 它绝对不会面临深度问题 - 事实上深度缓冲测试已关闭。

最佳答案

Transparency is best implemented using blend function (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) with primitives sorted from farthest to nearest.

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

我还会确保您在加载纹理时对 glTexImage2D 的调用使用的是 GL_RGBA 或 GL_BGRA。

编辑:

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

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

关于c++ - OpenGL 多位 Alpha 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4681541/

相关文章:

c++ - Xcode 4.2 和 lambda 表达式 (OSX Lion)

c++ - 在控制台中打印一个填充的正方形

c++ - 通过 "using"表达式缩短 std::remove_const(decltype(something))

c++ - 3D 顶点类或结构

java - 缩放 OpenGL 游戏中的所有图形

opengl - libgdx - 用于刷线绘图的 blendFunc? (添加剂/非添加剂混合物)

c++ - 将 COFF lib 文件转换为 OMF 格式

c++ - 如何在 C++ 中为 GLSL 片段着色器实现 iGlobalTime?

opengl - 保留GLBlendFunc

objective-c - OpenGL ES 混合功能,因此颜色始终显示在背景上