在着色器中使用alpha测试的OpenGL ES 2.0透明度

时间:2011-05-15 08:23:32

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

我正在尝试在OpenGL ES 2.0中制作透明对象。我正在设置GL w /以下参数:

    GLES20.glEnable(GLES20.GL_DEPTH_TEST);
    GLES20.glDepthFunc(GLES20.GL_LESS);
    GLES20.glDisable(GLES20.GL_BLEND);
    GLES20.glClearDepthf(1.0f);

以下是着色器的代码:

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

private final String mFragmentShader = "precision mediump float;\n" +
        "varying 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";

生成的渲染图像:http://imgur.com/hNqm0 http://imgur.com/dmS2O。 请告诉我我做错了什么,它在Rendermonkey OpenGL ES模式下渲染得很好。

如果我使用

    GLES20.glDisable(GLES20.GL_BLEND);

用于初始化OpenGL我得到了正确的透明度但没有排序三角形。在这种情况下可能有些排序会有所帮助吗?

4 个答案:

答案 0 :(得分:5)

OpenGL支持Alpha混合。您在着色器中不需要特殊代码。尝试设置以下内容:

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

答案 1 :(得分:4)

好的,所以我找到了这个故障的原因。

即使深度测试被禁用,片段着色器也会丢弃某些使其透明的像素,但由于写入深度缓冲区,三角形仍然被遮挡。

我必须使用以下代码禁用写入深度缓冲区:

GLES20.glDepthMask(false);

显然,在Rendermonkey中也禁用了写入深度缓冲区,从而产生了正确的图像。

感谢下面的答案,但我不需要使用alpha混合 - 我必须使用alpha测试,而且不需要对三角形进行排序。

答案 2 :(得分:2)

OpenGL没有为您订购三角形。但是,由于您正在进行alpha测试并禁用混合,这对您来说应该不是问题。

答案 3 :(得分:2)

我认为你应该把“gl_FragColor = base;”在'else'喜欢

private final String mFragmentShader = 
    "precision mediump float;\n" +
    "varying vec2 vTextureCoord;\n" +
    "uniform sampler2D sTexture;\n" +
    "void main() {\n" +
    "  vec4 base = texture2D(sTexture, vTextureCoord);\n" +
    "  if(base.a < 0.1){ discard; }\n" +
    "  else { gl_FragColor = base; }\n" +
    "}\n";

这一个