3

我有一些 .png 文件用作我的 2d 游戏四边形精灵的纹理。

其中一些已经有部分透明的像素,我需要能够正确显示它们并将它们淡入/淡出。

最初,我使用以下混合模式绘制它们:

GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);

这适用于刚开始的实心纹理,我可以使用 1.0f 和 0.0f 之间的任何值来引入透明度。到目前为止一切都很好,但是当我尝试使用其中已经具有透明度的 png 时,它们将无法正确显示(它们太暗并且轮廓很暗)。

我做了很多研究,发现我需要为这些类型的纹理更改我的混合模式,因为上面的那个不能正常工作,所以这就是我现在所拥有的(包括我的着色器)...... ..

片段着色器

String strFShader =
"precision mediump float;" +
"varying vec2 v_texCoords;" +
"uniform sampler2D u_baseMap;" +
"void main()" +
"{" +
"gl_FragColor = texture2D(u_baseMap, v_texCoords);" +
"gl_FragColor.a *= "+1.0f+";"+  //** Where 1.0f is the amount to blend, with 0.0f being completely transparent and 1.0f being as per the original png file.
 "}";

代码

GLES20.glEnable(GLES20.GL_BLEND); 
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

GLES20.glDisable(GLES20.GL_BLEND);

如果我在着色器(如上)中使用这个值为 1.0f 绘制半透明纹理,它会画得很好。但是,如果我尝试将其淡出,有些颜色似乎会淡出,而有些则不会,所以当它处于 0.0f 时,我只剩下原始纹理的奇怪颜色版本。

如果有人能告诉我如何正确渲染这些类型的纹理,我将不胜感激。

谢谢

4

2 回答 2

1

如果它们太暗并且轮廓很暗,这似乎是由于颜色通道被 Alpha 通道预乘造成的。在这种情况下,在纹理非常透明的部分,颜色是暗淡的。假设,如果像素的 alpha 为 0.9,那么预乘的RGB颜色将比实际暗 90%。

为了在没有 RGB 通道被 alpha 预乘的情况下加载 PNG 图像,我们使用 3rd 方PNGDecoder,然后使用glTexImage2D(). 您可以PNGDecoder从这里获取库来解码 PNG:http: //twl.l33tlabs.org/#downloads

于 2013-04-10T07:03:26.033 回答
1

最后我不需要将图像转换为非预乘图像,我只是将它们保持在该格式并将我的着色器中的行更改为:

"gl_FragColor *= "+op+";"+

并且用过......

GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);

完美运行。

于 2013-04-10T18:53:56.137 回答