c++ - 立即模式未正确绘制 alpha 纹理

标签 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

最佳答案

我想我找到了:

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

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

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

关于c++ - 立即模式未正确绘制 alpha 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36511597/

相关文章:

c++ - OpenGL - 编译期间出错

c++ - 如何获取用于 Active Directory API 的 IADsUser 对象?

c++ - 我们在 C++17 中有自动数组吗?

C++ 链接错误(Boost 线程)

c - 在 C 中提取格式化数据的有效方法

c - 输入字符会导致无限循环

c# - OpenGL闪烁问题

c++ - 在 wxGLCanvas 上调整大小之前无法初始化着色器

c++ - 为什么信号和槽比普通的旧回调更好?

c - C 静态变量初始化问题