立即模式无法正确绘制alpha纹理

时间:2016-04-09 01:06:51

标签: c++ c opengl textures immediate-mode

正如标题所说,每当我启用这样的混合:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

我无法使用立即模式绘制任何纹理。它是RGBA纹理。我确认图像加载和生成工作正常,就像我下载"来自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);

没有混合,我得到以下结果:

actual_no_blending

但是通过混合它根本不会画任何东西(同样,纹理的alpha值被证实是正确的!):

actual_blending

什么时候应该是这样的:

expected

这里有什么问题?

更新

应用glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);后,我现在得到预期的输出:

output_final

1 个答案:

答案 0 :(得分:1)

我想我找到了它:

glColor4ub(255, 255, 255, 0);

假设您使用GL_MODULATE应用纹理,alpha将与“基本”颜色混合。如果将基元的alpha设置为0,则任何具有纹理的混合将最终为0 alpha。

我不确定你想做什么,所以我建议做以下其中一项:

  1. 使用GL_REPLACE来应用纹理。调用glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE)。纹理环境是(活动)纹理单元配置的一部分。来自https://www.opengl.org/sdk/docs/man2/xhtml/glTexEnv.xml
  2.   

    对于OpenGL 1.3及更高版本,或者ARB_multitexture   支持扩展, glTexEnv控制纹理环境   由glActiveTexture

    选择的当前活动纹理单元
    1. 将原始颜色设置为(255,255,255,255)ub。