Android 透明着色器使用清晰的颜色填充透明片段

Android 透明着色器使用清晰的颜色填充透明片段,android,opengl-es,opengl-es-2.0,Android,Opengl Es,Opengl Es 2.0,我正在尝试在OpenGLES2.0中创建透明对象。 这是一个实时壁纸,我使用GLWallperService作为基类。 我以这种方式设置OpenGL: GLES20.glEnable(GLES20.GL_DEPTH_TEST); GLES20.glDepthFunc(GLES20.GL_GEQUAL); GLES20.glClearDepthf(0.0f); GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 在墙纸初始化中

我正在尝试在OpenGLES2.0中创建透明对象。 这是一个实时壁纸,我使用GLWallperService作为基类。 我以这种方式设置OpenGL:

    GLES20.glEnable(GLES20.GL_DEPTH_TEST);
    GLES20.glDepthFunc(GLES20.GL_GEQUAL);
    GLES20.glClearDepthf(0.0f);
    GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
在墙纸初始化中,我设置了渲染模式:

        setRenderMode(RENDERMODE_CONTINUOUSLY);
我使用的着色器来自PowerVR样本OGLES2AlphaTest,用于alpha测试,在我的HTC Desire设备上运行良好。
以下是着色器的代码:

private final String mVertexShader = "uniform highp mat4 uMVPMatrix;\n" +
        "attribute highp vec4 aPosition;\n" +
        "attribute highp vec2 aTextureCoord;\n" +
        "varying mediump vec2 vTextureCoord;\n" +
        "void main() {\n" +
        "  gl_Position = uMVPMatrix * aPosition;\n" +
        "  vTextureCoord = aTextureCoord;\n" +
        "}\n";

private final String mFragmentShader = "precision mediump float;\n" +
        "varying mediump vec2 vTextureCoord;\n" +
        "uniform sampler2D sTexture;\n" +
        "void main() {\n" +
        "  vec4 base = texture2D(sTexture, vTextureCoord);\n" +
        "  if(base.a < 0.5){ discard; }\n" +
        "  gl_FragColor = base;\n" +
        "}\n";
渲染的结果图像:。 但是如果我使用

        setRenderMode(RENDERMODE_WHEN_DIRTY);

对于初始化墙纸,我可以获得正确的渲染,但在切换到其他活动并返回墙纸后,只有1帧静止。如果我尝试定期调用
requestRender()
,我仍然会得到错误的透明度

好的,我解决了。这是由于写入深度缓冲区造成的。

我将问题缩小到着色器,请参考此问题:
        setRenderMode(RENDERMODE_WHEN_DIRTY);