2013-07-17 359 views
1

我正在爲OpenGL ES 2.0,iOS開發一個簡單的3D應用程序。在Open GL ES 2.0中從深度緩衝區獲取黑色

我想要做的是我想在片段着色器的深度緩衝區中獲取場景的深度值。

所以,我創建深度緩衝器作爲2D紋理

GLuint texture; 
glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, size.x, size.y, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); 

self.Dimension = IVVec3I_Make(size.x, size.y, 0); 
self.BufferObjID = texture; 

,並將其附連到幀緩衝器爲深度附件。

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, pRD.BufferObjID,0); 

當我使我的場景,深度緩存工作正常(深度測試和深度寫入所有工作完美)。

但是,當我將深度緩衝區分配給着色器中的採樣器並使用全屏四面體將深度緩衝區渲染到屏幕時,它全是黑色的。而且,着色器本身沒有任何問題,因爲當我將另一個正常紋理指定給採​​樣器時,它會正確渲染紋理。

這是片段着色器。

uniform sampler2D DepthBuffer; 

void main() 
{ 
    highp vec2 tex_coord = vec2(gl_FragCoord.x/1024.0,gl_FragCoord.y/768.0); 

    tex_coord.y = 1.0-tex_coord.y; 

    gl_FragColor = texture2D(DepthBuffer, tex_coord); 
} 

當我通過捕獲的OpenGL ES幀檢查的深度緩衝器,調試器顯示所有白色深度緩衝器(因爲幾乎所有的深度值是相當接近1.0這是正確的)。

那麼,這裏有什麼問題?

回答

0

很難說沒有更多的從你的應用程序設置的,但這裏有一些猜測:

*設置GL_TEXTURE_COMPARE_MODE參數爲您深度紋理GL_NONE。如果這是GL_COMPARE_R_TO_TEXTURE,它可能不會產生您所期望的。

*您真的只需要從紋理二維查找的第一個組件,因爲存儲單個值。 你可以在你的frag着色器試試這個:

gl_FragColor = vec4(texture2D(DepthBuffer, tex_coord).rrr, 1.0); 

我還考慮這些實驗。

*手工檢查紋理的內容,通過glReadPixels

*深度紋理的內容複製到一個顏色紋理,並嘗試渲染(我建議glBlitFramebuffer,但它不提供ES 2.0)。你可以使用glReadPixels,然後使用glTexImage2D。

+0

感謝您的建議。但是,他們沒有幫助:(而且,據我所知,glReadPixels不適用於ES 2中的深度附件。0 –

+0

glReadPixels上的好點。 我仍然對檢查紋理數據感到好奇。您可以綁定呈現到深度紋理的FB,然後使用glCopyTexImage2D將其複製到虛擬顏色紋理中。然後你可以閱讀! –

1

縮股利,

我已經運行到完全相同的問題,事實證明,在紋理過濾是問題。 嘗試GL_NEAREST,如下所示。

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES30.GL_DEPTH_COMPONENT32F, texWidth, texHeight, 
    0, GLES20.GL_DEPTH_COMPONENT, GLES20.GL_FLOAT, null); 
GLES30.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES30.GL_TEXTURE_COMPARE_MODE, GLES20.GL_NONE); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); 

注意:我使用GLES 3.0,但此修復程序可與2.0還。 設備:HTC m8 t-mo Android 5.0棒棒糖

+1

從渲染目標紋理讀取時,我在nvidia tegra硬件上遇到類似問題。 Tegra具有渲染目標紋理的地址模式限制: \t glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); \t glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); 可能相同的要求與深度緩衝區紋理有關。 – Dave