具有透明区域的纹理将区域渲染为黑色 - 如何使它们透明



我有一个非常简单的2d正方形,我从纹理渲染游戏精灵。 这一切都运行良好,除了纹理中应该透明的区域被渲染为黑色。 如何渲染这些透明区域以显示正方形后面的对象(在本例中为背景)?


如果相关,这里是简单的片段着色器:

uniform sampler2D uTexture;
varying vec2 vImagePosition;
void main(){
    gl_FragColor =  texture2D(uTexture, vImagePosition);
}

和顶点着色器:

attribute vec4 aPosition;
attribute vec2 aImagePosition;
uniform mat4 uMVPMatrix;
varying vec2 vImagePosition;
void main(){
    gl_Position = uMVPMatrix*aPosition;
    vImagePosition = aImagePosition;
}

经过几个小时的搜索,我实际上偶然发现了答案。 你必须打开混合。 希望这对其他人有所帮助。

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

您可能更喜欢将透明区域编码为 alpha 通道,以便透明区域具有平滑过渡。如果您只使用黑色 RGB(0,0,0) 颜色,则应在片段着色器中考虑到这一点。黑色不代表没有颜色,意味着黑色。启用 OpenGL 混合状态,以便在将像素值写入缓冲区时考虑从片段着色器出来的 Alpha 通道。例如:

uniform sampler2D uTexture;
varying vec2 vImagePosition;
vec4 color;
void main(){
    color =  texture2D(uTexture, vImagePosition);
    if(color.r == 0 && color.g == 0 && color.b == 0){
        gl_FragColor = vec4(0,0,0,0);
    } else{
        gl_FragColor = color;
    }
}

(我没有检查上面的代码是否编译,只是给你一个想法)。

最新更新