【问题标题】:Black Alpha in Textures on Android When Using OpenGL ES 2使用 OpenGL ES 2 时 Android 上纹理中的黑色 Alpha
【发布时间】: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);

【问题讨论】:

  • 发布设置纹理的代码可能有助于缩小问题范围。不过,您的混合功能看起来是正确的。
  • 我已经编辑并添加了我的纹理设置代码。

标签: android opengl-es


【解决方案1】:

这只是猜测。

如果你想混合,你应该在 glClear 函数中使用 GL_DEPTH_BUFFER_BIT 标志:

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多