2012-07-01 100 views
1

我無法使用iOS 5上的MonoTouch獲取深度緩衝區。我使用標準MonoTouch「OpenGL Application」模板並添加了此代碼以測試深度緩衝器(OpenGL ES的1.1):OpenGL ES 1.1深度緩衝區無法在iOS 5上使用MonoTouch工作

GL.Enable(All.DepthTest); 
GL.DepthFunc(All.Greater); 
GL.DepthMask(true); 

// Shape A 
GL.DrawArrays (All.TriangleStrip, 0, 4); 

// Shape B (should be behind Shape A) 
GL.Translate (.5f,.5f,.5f); 
GL.DrawArrays (All.TriangleStrip, 0, 4); 

// Shape C (should be in front of Shape A) 
GL.Translate (-1f,-1f,-1f); 
GL.DrawArrays (All.TriangleStrip, 0, 4); 

兩種形狀B和C被繪製的形狀A.同樣的事情發生,即使 「GL.DepthFunc(All.Never)」 的前面。深度緩衝區完全被忽略。我也試過手動創建一個深度緩存(而不是依靠的MonoTouch/OpenTK「iPhoneOSGameView」創造一個對我來說)使用此代碼:

protected override void CreateFrameBuffer() 
{ 
    base.CreateFrameBuffer();  
    uint depthbuffer=0; 
    GL.Oes.GenRenderbuffers (1, ref depthbuffer); 
    GL.Oes.BindFramebuffer (All.RenderbufferOes, depthbuffer); 
    GL.Oes.RenderbufferStorage (All.RenderbufferOes, All.DepthComponent16Oes, (int) 768, (int) 1024); 
    GL.Oes.FramebufferRenderbuffer (All.FramebufferOes, All.DepthAttachmentOes, All.RenderbufferOes, depthbuffer); 
} 

它仍然沒有工作。你有什麼想法如何讓深度緩衝區工作?我錯過了什麼嗎?

回答

2

感謝holmes發佈的NeHe-Lesson,我找到了一個解決方案:我使用「OpenTK.Graphics.ES20.GL」中的方法代替「OpenTK.Graphics.ES11.GL.Oes」中的方法來創建深度緩衝區。在創建緩衝區之後,我可以在「OpenTK.Graphics.ES11」中使用標準的OpenGL 1.1方法來執行我的程序的其餘部分。這裏是代碼:

OpenTK.Graphics.ES20.GL.GenRenderbuffers (1,ref depthRenderBuffer); 
OpenTK.Graphics.ES20.GL.BindRenderbuffer (OpenTK.Graphics.ES20.All.Renderbuffer, depthRenderBuffer); 
OpenTK.Graphics.ES20.GL.RenderbufferStorage (OpenTK.Graphics.ES20.All.Renderbuffer, OpenTK.Graphics.ES20.All.DepthComponent16, Size.Width, Size.Height); 
OpenTK.Graphics.ES20.GL.FramebufferRenderbuffer (OpenTK.Graphics.ES20.All.Framebuffer, OpenTK.Graphics.ES20.All.DepthAttachment, OpenTK.Graphics.ES20.All.Renderbuffer, depthRenderBuffer); 
1

請嘗試以下操作。

GL.ClearDepth(1.0f);  
GL.Enable(All.DepthTest); 
GL.DepthFunc(All.Lequal); 

另外不要忘記清除每個渲染的深度。

GL.Clear((int)(All.ColorBufferBit | All.DepthBufferBit)); 

我在學習的時候在Github上使用MonoTouch發佈了我的NeHe課程代碼。 This是需要深度測試的第一課,我給你一些更多的信息。

+0

感謝您的鏈接!這非常有幫助。我通過使用「OpenTK.Graphics.ES20.GL」中的方法而不是「OpenTK.Graphics.ES11.GL.Oes」中的方法來創建深度緩衝區。在創建緩衝區之後,我可以在「OpenTK.Graphics.ES11」中使用標準的OpenGL 1.1方法來執行我的程序的其餘部分。 – Heiko