【问题标题】:Immediate mode not drawing alpha texture correctly立即模式未正确绘制 Alpha 纹理
【发布时间】:2016-04-09 01:06:51
【问题描述】:

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

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);

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

但是混合后它什么也没有画出来(再次确认纹理的 alpha 值是正确的!):

什么时候应该是这样的:

这里有什么问题?

更新

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

【问题讨论】:

  • "glActiveTexture(GL_TEXTURE0 + i);"我是什么?
  • 我是setActive的参数

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


【解决方案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

对于 OpenGL 版本 1.3 及更高版本,或当 ARB_multitexture 支持扩展,glTexEnv 控制纹理环境 当前活动的纹理单元,由 glActiveTexture 选择

  1. 将原始颜色设置为 (255, 255, 255, 255)ub。

【讨论】:

  • 如何将其更改为 GL_REPLACE?我相信这是通过调用glTexEnvI,但使用哪些参数?另外,我必须在创建纹理之前调用它,还是完全不相关?
  • @calcyss 已编辑答案。
猜你喜欢
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
相关资源
最近更新 更多