立即模式未正确绘制 alpha 纹理
Immediate mode not drawing alpha texture correctly
正如标题所说,每当我像这样启用混合时:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
我无法使用立即模式绘制任何纹理。它是一个 RGBA 纹理。我确认图像加载和生成工作正常,因为当我 "downloaded" 来自 GPU 的像素进行调试时,alpha 值似乎是正确的(例如,并非所有的都是 255。)。但是,在启用混合的情况下像这样绘制纹理时纹理就消失了:
glColor4ub(255, 255, 255, 0);
_texture->setActive(0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(_x, _y);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(_x + _width, _y);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(_x + _width, _y + _height);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(_x, _y + _height);
glEnd();
其中 _texture->setActive()
简单地称之为:
glActiveTexture(GL_TEXTURE0 + i);
glBindTexture(GL_TEXTURE_2D, m_ID);
没有混合,我得到以下结果:
但是通过混合它什么也画不出来(再次确认纹理的 alpha 值是正确的!):
什么时候应该看起来像这样:
这里有什么问题?
更新
应用 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
后,我现在得到了预期的输出:
我想我找到了:
glColor4ub(255, 255, 255, 0);
假设您使用 GL_MODULATE 应用纹理,alpha 将与 "primitive" 颜色混合。如果将图元的 alpha 设置为 0,那么任何与纹理的混合最终都会变成 0 alpha。
我不确定你想做什么,所以我建议执行以下操作之一:
- 改为使用 GL_REPLACE 应用纹理。调用 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)。纹理环境是您(活动的)纹理单元配置的一部分。来自 https://www.opengl.org/sdk/docs/man2/xhtml/glTexEnv.xml
For OpenGL versions 1.3 and greater, or when the ARB_multitexture
extension is supported, glTexEnv controls the texture environment for
the current active texture unit, selected by glActiveTexture
- 将原始颜色设置为 (255, 255, 255, 255)ub.
正如标题所说,每当我像这样启用混合时:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
我无法使用立即模式绘制任何纹理。它是一个 RGBA 纹理。我确认图像加载和生成工作正常,因为当我 "downloaded" 来自 GPU 的像素进行调试时,alpha 值似乎是正确的(例如,并非所有的都是 255。)。但是,在启用混合的情况下像这样绘制纹理时纹理就消失了:
glColor4ub(255, 255, 255, 0);
_texture->setActive(0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(_x, _y);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(_x + _width, _y);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(_x + _width, _y + _height);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(_x, _y + _height);
glEnd();
其中 _texture->setActive()
简单地称之为:
glActiveTexture(GL_TEXTURE0 + i);
glBindTexture(GL_TEXTURE_2D, m_ID);
没有混合,我得到以下结果:
但是通过混合它什么也画不出来(再次确认纹理的 alpha 值是正确的!):
什么时候应该看起来像这样:
这里有什么问题?
更新
应用 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
后,我现在得到了预期的输出:
我想我找到了:
glColor4ub(255, 255, 255, 0);
假设您使用 GL_MODULATE 应用纹理,alpha 将与 "primitive" 颜色混合。如果将图元的 alpha 设置为 0,那么任何与纹理的混合最终都会变成 0 alpha。
我不确定你想做什么,所以我建议执行以下操作之一:
- 改为使用 GL_REPLACE 应用纹理。调用 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)。纹理环境是您(活动的)纹理单元配置的一部分。来自 https://www.opengl.org/sdk/docs/man2/xhtml/glTexEnv.xml
For OpenGL versions 1.3 and greater, or when the ARB_multitexture extension is supported, glTexEnv controls the texture environment for the current active texture unit, selected by glActiveTexture
- 将原始颜色设置为 (255, 255, 255, 255)ub.