6

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

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

有解决此问题的方法吗?

上面展示了它应该是什么样子,下面展示了它的样子:

替代文字

4

4 回答 4

3

试试这个:

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);
于 2010-09-20T12:46:18.607 回答
1

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

gl.glDisable(GL10.GL_ALPHA_TEST);
于 2010-09-07T08:17:13.000 回答
0

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

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

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

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

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

于 2010-09-08T09:07:18.167 回答
0

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

于 2010-09-12T11:04:53.373 回答