1

我无法在 iOS 5 上使用 MonoTouch 使深度缓冲区工作。我正在使用标准的 MonoTouch“OpenGL 应用程序”模板并添加此代码来测试深度缓冲区(OpenGL ES 1.1):

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);
}

它仍然无法正常工作。你知道我怎样才能让深度缓冲区工作吗?我错过了什么吗?

4

2 回答 2

2

感谢发布的NeHe-Lesson holmes,我找到了一个解决方案:我使用“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);
于 2012-07-04T21:33:08.917 回答
1

试试下面的。

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

也不要忘记清除每个渲染的深度。

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

我在学习时使用 MonoTouch 在 Github 上发布了 NeHe 课程的代码。 是需要深度测试的第一课,我会为您提供更多信息。

于 2012-07-03T16:24:17.910 回答