c++ - OpenGL混合: texture on top overlaps its pixels which should be transparent (alpha = 0)

标签 c++ opengl

我正在绘制 map 纹理,并在其顶部绘制颜色条纹理。两者都有 Alpha channel ,我正在使用混合,设置为

// Turn on blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

但是,会发生以下情况:

texture on top with alpha channel imposes its black pixels

带有 Alpha channel 的顶部纹理(颜色栏)强加了黑色像素,这是我不希望发生的情况。 map 纹理应出现在颜色条 alpha = 0 的后面。

这与混合定义有关吗?我该如何更改?

最佳答案

假设纹理有一个 Alpha channel 并且在正确的位置是透明的,我怀疑问题出在渲染顺序和深度测试上。

假设您首先渲染比例纹理。它与黑色背景正确混合。然后渲染其后面的橙色纹理,但缩放纹理中的像素具有更高的深度值,导致那里的橙色纹理被丢弃。

因此,请确保按照从后到前的顺序或从最远到最近的顺序渲染所有透明内容。

在不考虑顺序无关透明度的情况下,alpha 透明度的常见方法如下:

  1. 启用深度缓冲区
  2. 渲染所有不透明几何体
  3. 禁用深度写入 (glDepthMask)
  4. 启用 Alpha 混合(如 OP 代码中所示)
  5. 按照从远到近的顺序渲染透明几何体

对于粒子,有时您可以不进行排序,但看起来仍然不错。另一种方法是使用 alpha 测试或使用 alpha 来覆盖多重采样帧缓冲区。

关于c++ - OpenGL混合: texture on top overlaps its pixels which should be transparent (alpha = 0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31720323/

相关文章:

c++ - XCode 和 _bittest 函数

c++ - opengl 3+缓冲操作

c++ - GLEW/SFML 程序未在 MinGW 中编译 - "GLChar"无法识别

java - 使用 glBufferSubData() 更新 VBO 数据

opengl - 一次更新多个着色器程序中的统一变量

c++ - 使用指令和部分特化

c++ - 将 Mat 拆分为相同大小的 subMat

c++ - Spirit 无法将属性分配给单元素结构(或 fusion 序列)

java - 避免多次加载纹理

c++ - OpenGL 向后兼容性