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

时间:2012-12-10 04:51:52

标签: android opengl-es opengl-es-2.0

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


包含相关内容,这是简单片段Shader:

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;
}

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

您可能更喜欢将透明区域编码为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;
    }
}

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