【问题标题】:android/opengles alpha textures not semitransparent but binary transparentandroid/opengles alpha 纹理不是半透明但二进制透明
【发布时间】:2011-04-07 18:14:32
【问题描述】:

我正在使用 Alpha 通道绘制一些纹理,但是当它们显示时,看起来 Alpha 通道只是二进制的。所以一个像素要么是透明的,要么是不透明的,尽管在纹理文件本身中像素是半透明的。混合设置如下:

gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);

这个问题有解决办法吗?

上面展示了它应该是怎样的,下面展示了它是怎样的:

【问题讨论】:

  • 你在那个纹理中使用了什么 internalFormat?
  • 我可以获得更多关于 PNG 的信息吗?比如它是如何保存的?
  • 它是用 Photoshop 保存的,相信我,它有一个不同值的 alpha 通道。它不是二进制透明的。
  • 您能否发布一个指向 PNG 文件的链接,以便我可以使用相同的资源对其进行测试?仅在可能的情况下。
  • deviantsart.com/upload/2757n63.png 但同样,我不认为 PNG 是问题,因为我在正常的 GL 渲染中经常使用这样的 PNG,它们工作正常。

标签: android opengl-es transparency textures alphablending


【解决方案1】:

似乎它使用的是 alpha 测试而不是 alpha 混合,这可以解释阈值行为。虽然默认情况下未启用,但可能值得一试:

gl.glDisable(GL10.GL_ALPHA_TEST);

【讨论】:

  • alpha 测试已被禁用,我还对我正在绘制的所有对象进行深度排序
【解决方案2】:

您的 GLSurfaceView 使用什么表面格式?是半透明(不透明)的格式吗?

surfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);

此外,EGL 设置必须设置 alpha 支持。这将为您提供最好的质量...

surfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);

编辑: 另一个想法是,也许您没有使用 glTexImage2D 以半透明格式将图像上传到 OpenGL?

【讨论】:

    【解决方案3】:

    您是否将 PNG 存储到只有 1 位 alpha 的 GL 纹理,例如 16 位 5-5-5-1 格式?这将导致上述行为。

    【讨论】:

      【解决方案4】:

      试试这个:

      gl.glEnable(GL10.GL_BLEND);    
      gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
      
      gl.glEnable(GL10.GL_ALPHA_BITS);
      //draw...
      gl.glDisable(GL10.GL_ALPHA_BITS);
      

      【讨论】:

      • 谢谢。但是在我的情况下,它也可以在没有 GL_ALPHA_BITS 调用的情况下工作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      • 2011-11-08
      • 2023-03-20
      • 2012-10-26
      相关资源
      最近更新 更多