我正在用 alpha 通道绘制一些纹理,但是当它们显示出来时,看起来 alpha 通道只是二进制的。所以一个像素要么是透明的,要么是不透明的,尽管在纹理文件本身中像素是半透明的。混合设置如下:
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
有解决此问题的方法吗?
上面展示了它应该是什么样子,下面展示了它的样子:
我正在用 alpha 通道绘制一些纹理,但是当它们显示出来时,看起来 alpha 通道只是二进制的。所以一个像素要么是透明的,要么是不透明的,尽管在纹理文件本身中像素是半透明的。混合设置如下:
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
有解决此问题的方法吗?
上面展示了它应该是什么样子,下面展示了它的样子:
试试这个:
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);
似乎它使用的是 alpha 测试而不是 alpha 混合,这可以解释阈值行为。尽管默认情况下未启用,但可能值得尝试:
gl.glDisable(GL10.GL_ALPHA_TEST);
您的 GLSurfaceView 使用什么表面格式?它是半透明(不透明)的格式吗?
surfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
此外,EGL 设置必须设置 alpha 支持。这将为您提供最好的质量...
surfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
编辑:另一个想法是,也许您没有使用 glTexImage2D 以半透明格式将图像上传到 OpenGL?
您是否将 PNG 存储到只有 1 位 alpha 的 GL 纹理,例如 16 位 5-5-5-1 格式?这将导致上述行为。