我有一个非常简单的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;
}
答案 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;
}
}
(我没有检查上面的代码是否编译,只是为了给你一个想法)。