我在渲染具有 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 函数。
关于c++ - OpenGL 多位 Alpha 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4681541/