【发布时间】:2014-09-17 21:28:46
【问题描述】:
类似问题有很多答案,但我认为它们不适用于我。当我使用 OpenGL ES 1 时,alpha 被正确混合。在大多数手机上,alpha 已正确混合。在某些手机上,我会在不应该绘制像素的地方得到纯不透明的黑色。我正在加载带有预乘 alpha 的纹理。我尝试使用 Java 加载器并使用 libpng(我正在使用库,Allegro,这很容易),没有任何变化。用于混合 Allegro 用途:
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
我认为这对于预乘 alpha 是正确的,因为它适用于大多数 Android、所有 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);
【问题讨论】:
-
发布设置纹理的代码可能有助于缩小问题范围。不过,您的混合功能看起来是正确的。
-
我已经编辑并添加了我的纹理设置代码。