OpenGL透明图像中有黑色

Emb*_*cro 5 android alpha blending opengl-es overlap

我正在开发Android游戏,我想知道为什么每当我用透明度绘制图像时,似乎总是会在透明部分添加一些黑色.这种情况一直发生,使我的一些效果看起来很奇怪.

这是一个例子.这两个圆圈只是带有模糊的白色图像,但是你可以看到一个圆圈与另一个重叠,它有一个阴影.如果我在Inkscape中说两个圆圈重叠,我会在它们重叠的地方得到纯白色.

在此输入图像描述

我在用

GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

为了我的混合.

知道为什么会这样,我怎么能避免呢?

编辑:我唯一能想到的是两张图片有相同的z所以也许它们只与背景混合而不是彼此混合?

编辑:我改变了

GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_DST_ALPHA);
Run Code Online (Sandbox Code Playgroud)

这是我正在寻找的结果.

在此输入图像描述

现在唯一的事情是,我所拥有的透明图像中的透明图像会被忽略,这是有道理的,因为我认为目标alpha是1.为什么One minus源会添加灰色?

Emb*_*cro 12

我想出了如何解决它.

我变了

GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

事实证明,当你加载它时,Android会预先乘以PNG图像纹理的alpha值(使白色变为灰色).

我补充道

vColor.r = vColor.r * vColor.a;
vColor.g = vColor.g * vColor.a;
vColor.b = vColor.b * vColor.a;
Run Code Online (Sandbox Code Playgroud)

到我的顶点着色器为我的其他颜色进行乘法运算.