c++ - Alpha channel 被渲染为黑色。怎么让它透明呢?

标签 c++ opengl rendering soil

我正在加载 32 位的 png 纹理和一些透明区域。我已在初始化函数中设置此代码:

// OpenGL
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glEnable( GL_ALPHA_TEST );
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glClearColor( 0.0, 0.0, 0.0, 0.0 );

这就是我加载纹理的方式:

// Load textures
glGenTextures( 1, &this->texture );

int width, height;
unsigned char* image;

glActiveTexture( GL_TEXTURE0 );
glBindTexture( GL_TEXTURE_2D, this->texture );
std::string path = "../assets/textures/" + name;
image = SOIL_load_image( path.c_str(), &width, &height, 0, SOIL_LOAD_RGBA );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
SOIL_free_image_data( image );
glUniform1i( glGetUniformLocation( shader->shader, "materialTex" ), 0 );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

这是我得到的效果:

example

我正在尝试使草背景从黑色变为透明。

你能帮我吗?

最佳答案

这里有几个问题,但它们都归结为 Alpha 透明度与顺序相关的事实。

目前尚不清楚您为什么要使用深度缓冲区。该应用程序似乎是 2D 的,而且您似乎正在以相同的深度绘制每个 2D 图层。尽管如此,您要绘制的红色背景需要先绘制。

如果您在启用深度测试的情况下绘制背景,它会将其深度值写入深度缓冲区,然后您尝试在其上绘制的其他 Sprite 将失败,因为默认深度测试为GL_LESS (这会拒绝具有相同深度的部分对象)。如果在绘制背景时禁用深度测试,也会禁用深度写入,这是解决问题的一种可能方法。

实际上,您可以完全消除深度测试并遵循 Alpha 混合的黄金法则:

  • 先绘制不透明几何体,然后按深度对半透明对象进行排序

关于c++ - Alpha channel 被渲染为黑色。怎么让它透明呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23940020/

相关文章:

c++ - 基于航拍图像的地面机器人障碍物检测

c++ - 何时使用 vector 中的对象以及何时使用指向 vector 中对象的指针?

c++ - CPPUnit - 全局变量

opengl - OpenGL 中的每像素绘图

c++ - 如何在不同的线程上调用 glReadPixels?

javascript - Ember.js 命名导出错误

algorithm - 在不使用范围值的情况下渲染温度图

c++ - 根据字符串表示设置枚举值

c++ - vsync "wait"(阻塞)在什么时候发生?

java - 使用 OpenGL 调整图像大小