2011-05-15 50 views
4

我想在OpenGL ES 2.0中製作透明對象。我設置了GL瓦特/以下PARAMS:在着色器中使用alpha測試的OpenGL ES 2.0透明度

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/hNqm0http://imgur.com/dmS2O。 請告訴我我在做什麼錯,它在Rendermonkey OpenGL ES模式下渲染得很好。

如果我使用

GLES20.glDisable(GLES20.GL_BLEND); 

初始化OpenGL的我得到正確的透明度,而且沒有三角形的順序。在這種情況下可能會進行一些排序?

回答

4

好的,所以我找到了這個故障的原因。

即使禁用了深度測試,並且片段着色器丟棄了某些使其透明的像素,但由於寫入深度緩衝區,三角形仍然被遮擋。

我不得不關閉這個代碼寫深度緩存:

GLES20.glDepthMask(false); 

顯然,寫入深度緩存在RenderMonkey中禁用太大,導致正確的圖像。

感謝您的回答,但我不需要使用阿爾法混合 - 我必須使用阿爾法測試,並且它不需要排序三角形。

2

OpenGL並沒有爲你排列你的三角形。但是,因爲您只是在進行alpha測試並禁用混合,所以對您而言這不應該是個問題。

+0

是的,我不整理三角形,alpha測試不需要三角形進行排序。 – keaukraine 2012-08-09 20:21:40

5

Alpha混合由OpenGL支持。着色器中不需要特殊的代碼。嘗試設置以下內容:

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

謝謝,但我沒有使用alpha混合,只通過丟棄片段着色器中的某些像素進行alpha測試。我需要這樣做,因爲我不需要對多邊形進行排序,而且alpha混合很慢。 – keaukraine 2012-08-09 20:20:55

2

我想你應該把「gl_FragColor = base;」在「其他」像

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"; 

這個