2014-10-20 94 views
-1

我努力让深度测试在应用程序中正常工作。OpenTK/OpenGL深度测试问题

深度似乎是完全基于抽签顺序,在这里看到: https://www.youtube.com/watch?v=YErS_loJW7w&feature=youtu.be

您可以在视频中看到,苏珊的点云是在网格模型的前面,但旋转时,它结束了在它后面。

我认为下面的代码是相关

// clear the render buffer.... 
GL.Enable(EnableCap.DepthTest); 
GL.DepthMask(true); 
GL.ClearColor(Color.Black); 
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);   

// Render main 3d scene 
GL.Enable(EnableCap.CullFace); 
GL.CullFace(CullFaceMode.Back); 
GL.Enable(EnableCap.DepthTest); 
GL.Enable(EnableCap.DepthClamp); 
GL.DepthFunc(DepthFunction.Always); 
GL.DepthMask(true); 

我的印象是,启用深度测试将正确地做这项工作的一切。

怎么回事?

+1

您在创建GL上下文时是否请求了一些深度缓冲区位?除非你问,否则你可能得不到。 – genpfault 2014-10-20 20:57:29

+0

OpenGl对我来说是比较新的。我如何看?看看我使用的OpenTK GLControl的文档似乎表明提供了一个深度缓冲区。 “...请注意,GLControl提供了一个颜色和深度缓冲区,我们必须使用GL.Clear()来清除。” – Chris 2014-10-20 21:33:33

回答

0

设置GL.DepthFunc(DepthFunction.Always);使事情出错。这是告诉GL从不丢弃碎片,即使它们落在先前绘制的对象之后。您应该使用GL_LESSGL_LEQUAL比较模式。

+0

感谢您的回复。我已将其修改为LESS。我假设碎片被丢弃,但它们似乎仍然基于绘制顺序而不是Z顺序被丢弃。这是我需要告诉GL明确做的事吗? – Chris 2014-10-20 21:35:42