我正在加载一个带有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 );
这是我得到的效果:
我正试图让草背景从黑色变为透明。
你能帮助我吗?
答案 0 :(得分:2)
这里有一些问题,但它们都归结为alpha透明度依赖于顺序。
目前尚不清楚为什么首先使用深度缓冲区。该应用程序似乎是2D,而且您似乎正在绘制具有相同深度的每个2D图层。然而,您要绘制的红色背景需要先绘制。
如果您在启用深度测试的情况下绘制背景,它会将深度值写入深度缓冲区,然后您尝试在其上绘制的其他精灵将失败,因为默认深度测试为GL_LESS
(这会拒绝具有相同深度的部分物体)。如果在绘制背景时禁用深度测试,则还会禁用深度写入,这是解决问题的一种可能方法。
实际上,你可以完全消除深度测试并遵循alpha混合的黄金法则: