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

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

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

    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,我得到了正确的透明度,但没有三角形的顺序。在这种情况下,一些排序可能会有帮助吗?

最佳答案

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

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

关于java - 在着色器中使用 alpha 测试的 OpenGL ES 2.0 透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6007313/

相关文章:

android - 使用 cursorAdapter 获取按钮在 ListView 中单击的项目位置

ios - GLKView 后面的 UIImage

java - 从 XSOM 中的 XSElementDecl 检索 minOccurs 和 maxOccurs

javascript - jQuery Mobile 禁用页面内容垂直滚动

java - 如何限制在struts/Java中双击按钮?

Android - 如何完全禁用键盘锁

opengl-es - iPhone OpenGL ES : Applying a Depth Test on Textures that have transparent pixels for 2D game

opengl-es - eglQuerySurface 给出错误的大小

Java PreparedStatement 检索最后插入的 ID

java - "Error:Plugin is too old"这个gradle有什么问题?