1

我有一个非常简单的 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;
}
4

2 回答 2

4

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

GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
于 2012-12-10T06:21:13.077 回答
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;
    }
}

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

于 2012-12-10T05:52:35.833 回答