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