类似问题有很多答案,但我不认为它们适用于我。当我使用OpenGL ES 1时,alpha正确混合。在大多数手机上,alpha正确混合。在某些手机上,我会得到纯不透明的黑色,其中不应该绘制像素。我正在使用预乘alpha加载纹理。我尝试使用Java加载器并使用libpng(我正在使用库,Allegro,这很容易),没有任何变化。对于混合使用Allegro:
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
我认为这对于预乘alpha是正确的,因为它适用于大多数Androids,所有PC,Mac等。我认为可能有一些状态我没有初始化只对某些手机或默认值不同的情况,但我不确定。
我尝试将纹理加载为带有alpha的32位和带有alpha的16位,并且显示没有区别。
这就是我设置纹理的方法:
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);
答案 0 :(得分:0)
这只是猜测。
如果要混合,则应在 glClear 函数中使用 GL_DEPTH_BUFFER_BIT 标记:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
答案 1 :(得分:0)
问题是Allegro(我的游戏使用的库)在使用OpenGL ES 2.0时使用glBlendFuncSeparate - 它应该可以工作,但有些手机显然不支持它。使用glBlendFunc修复它!