kea*_*ine 4 java android opengl-es glsl opengl-es-2.0
我正在尝试在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);
Run Code Online (Sandbox Code Playgroud)
以下是着色器的代码:
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";
Run Code Online (Sandbox Code Playgroud)
得到的渲染图像:http ://imgur.com/hNqm0 http://imgur.com/dmS2O.请告诉我我做错了什么,它在Rendermonkey OpenGL ES模式下渲染得很好.
如果我使用
GLES20.glDisable(GLES20.GL_BLEND);
Run Code Online (Sandbox Code Playgroud)
初始化OpenGL我得到正确的透明度,但没有三角形的排序.在这种情况下可能有些排序会有所帮助吗?
OpenGL支持Alpha混合.您在着色器中不需要特殊代码.尝试设置以下内容
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc (GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)
好的,我已经找到这个故障的原因了。
尽管禁用深度测试,并且片段着色器丢弃某些像素使其透明,但由于写入深度缓冲区,三角形仍然被遮挡。
我必须使用以下代码禁用对深度缓冲区的写入:
GLES20.glDepthMask(false);
Run Code Online (Sandbox Code Playgroud)
显然,在 Rendermonkey 中也禁用了写入深度缓冲区,从而产生了正确的图像。
感谢您在下面的回答,但我不需要使用 alpha 混合 - 我必须使用 alpha 测试,并且它不需要对三角形进行排序。