使用OpenGL ES 2时Android上纹理中的黑色Alpha

使用OpenGL ES 2时Android上纹理中的黑色Alpha,android,opengl-es,Android,Opengl Es,类似的问题有很多答案,但我不认为它们适用于我。当我使用OpenGL ES 1时,alpha被正确地混合。在大多数手机上,alpha是正确混合的。在一些手机上,我得到的是纯不透明的黑色,不应该画像素。我正在加载带有预乘alpha的纹理。我尝试过使用Java加载程序,也尝试过使用libpng,我使用的是一个库Allegro,它很简单,没有任何改动。混合Allegro使用: glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

类似的问题有很多答案,但我不认为它们适用于我。当我使用OpenGL ES 1时,alpha被正确地混合。在大多数手机上,alpha是正确混合的。在一些手机上,我得到的是纯不透明的黑色,不应该画像素。我正在加载带有预乘alpha的纹理。我尝试过使用Java加载程序,也尝试过使用libpng,我使用的是一个库Allegro,它很简单,没有任何改动。混合Allegro使用:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
我认为这对于预乘alpha是正确的,因为它适用于大多数机器人、所有PC机、Mac机等。我想可能存在一些我没有初始化的状态,这些状态只在某些手机上起作用,或者默认值不同,但我不确定

我尝试过加载32位alpha和16位alpha的纹理,在显示上没有差异

这是我如何设置纹理的:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);

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_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glPixelStorei(GL_UNPACK_ALIGNMENT, pix_size);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
    w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf);
这是库代码,因此当我使用16位纹理时,最后一行更改为:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4,
    w, h, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, buf);
这只是一个猜测

如果要混合以下内容,应在glClear函数中使用GL\U DEPTH\U BUFFER\U BIT标志:


glClearGL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT

问题在于我的游戏使用的Allegro库在使用OpenGL ES 2.0时使用glBlendFuncSeparate-这应该可以工作,但一些手机显然不支持它。使用glBlendFunc修复了它

发布如何设置纹理的代码可能有助于缩小问题的范围。你的混合函数看起来是正确的。我已经编辑并添加了纹理设置代码。