2012-08-08 112 views
3

我無法在Android OpenGL ES 2.0上正確使用深度緩衝區。不管我做什麼,對象總是按照提供的順序渲染並完全忽略深度緩衝區。OpenGL ES深度緩衝區android,無法開始工作

從我讀過,默認的設置應該有一個深度緩衝,但我仍然嘗試,我能想到的每一個功能得到它的工作:

//setup 
setEGLContextClientVersion(2); 
setEGLConfigChooser(true); 

GLES20.glEnable(GLES20.GL_DEPTH_TEST); 
GLES20.glDepthFunc(GLES20.GL_LEQUAL); 
GLES20.glDepthMask(true); 

//render 
GLES20.glClearColor(0.8f, 0.5f, 0.8f, 1.0f); 
GLES20.glClearDepthf(1.0f); 
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 

我的配售對象在0.5 ,在z軸上爲0.0,-0.5。我可以驗證這是有效的,因爲如果我使用透視視圖,它將正確地改變對象的大小(較小的對象) - 我的頂點着色器除了應用視圖矩陣外什麼也不做。如果我是正確的,我不能在ES中改變片段着色器的深度,這樣就不會出錯。

我很難過。我真的不知道我還能檢查什麼。我所做的每一項搜索(在網上或在這裏)都給出了似乎無法解決問題的答案(儘管它表明人們出於其他原因而出現了問題)。 ES 2.0中的大多數示例實際上沒有足夠的對象來測試深度緩衝區,所以我不能確定示例代碼是正確的。


要評論:只需要打一個電話後,我的「設置」部分叫「超級」我的派生GLSurfaceView內,設置渲染之前。 「render」部分在我的渲染器「onDrawFrame」中首先被調用。

+0

你是否在創建GLSurfaceView後立即調用GLES20方法? – harism 2012-08-08 14:48:59

+0

我澄清了我稱之爲這些功能的地方。 – 2012-08-08 14:51:30

+3

在這種情況下,您可以嘗試在渲染代碼中移動所有GLES20調用。 – harism 2012-08-08 14:52:50

回答

7

harism的評論是正確的答案。一旦你有一個渲染上下文,下面三個函數就可以完成。我把它們放在onSurfaceCreated方法中,它可以工作。如果您在渲染過程中更改它們,也可以將它們放入onDraw方法中。

GLES20.glEnable(GLES20.GL_DEPTH_TEST); 
GLES20.glDepthFunc(GLES20.GL_LEQUAL); 
GLES20.glDepthMask(true); 
+2

使用所有三種都會造成奇怪的效果。只要添加.glEnable像你說的解決我的問題,謝謝。 – 2013-08-19 12:21:53

10

你指定了緩衝區深度嗎?這可能是解決您的問題的方法。

myGlSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); 
+0

我不認爲設置16位深度緩衝區有什麼區別,因爲16位是默認值(請參閱https://developer.android.com/reference/android/opengl/GLSurfaceView.html#setEGLConfigChooser(int,int ,int,int,int,int),24位應該這樣做,看看我的回答如下: – 2017-11-30 13:59:24

+0

呵呵,那是很久以前的了,不知道,但也許它更像是「不要忘記配置它之前你使用它「而不是特別有一個16位緩衝區。 – 2017-11-30 15:37:11

0

我有同樣的問題。我通過使用24位深度緩衝區而不是默認值(它是16位)來修復它(因此選擇16位深度緩衝區不會有任何區別)。我用

myGlSurfaceView.setEGLConfigChooser(8,8,8,8,24,0);

順便說一句我有同樣的問題,以有效地相同的解決方案,在iOS(我的代碼是一種便攜式的地圖渲染器,所以我需要它在許多平臺上運行)。 iOS的修復是調用

self.drawableDepthFormat = GLKViewDrawableDepthFormat24;

在我GLKView派生類的初始化函數。