当渲染到帧缓冲区而不是屏幕时,OpenGL深度排序在单个网格上失败
作为我问题的一个简单演示,我尝试将一个大但简单的网格渲染为一个纹理,以供以后使用,但奇怪的是,当从特定角度观看时,该网格的离摄影机部分越远,显示在离摄影机部分越近的前面。尽管不可否认的事实是,我毫无疑问使用深度测试:当渲染到帧缓冲区而不是屏幕时,OpenGL深度排序在单个网格上失败,opengl,3d,framebuffer,depth-testing,Opengl,3d,Framebuffer,Depth Testing,作为我问题的一个简单演示,我尝试将一个大但简单的网格渲染为一个纹理,以供以后使用,但奇怪的是,当从特定角度观看时,该网格的离摄影机部分越远,显示在离摄影机部分越近的前面。尽管不可否认的事实是,我毫无疑问使用深度测试: glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); 作为一个例子,我试图在以原点为中心的XZ平面上绘制一个细分网格,在网格的中间有一个光滑的小山。 当渲染到屏幕时,不会发生错误,并且网格看起来与使用正交投影渲染的网格类似,并且使用表示深
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
作为一个例子,我试图在以原点为中心的XZ平面上绘制一个细分网格,在网格的中间有一个光滑的小山。
当渲染到屏幕时,不会发生错误,并且网格看起来与使用正交投影渲染的网格类似,并且使用表示深度的灰度颜色,即使从任何一侧查看网格,也不会发生错误: 当然,通过确保帧缓冲区设置为0 glBindFramebufferGL_framebuffer,0;,可以完成对屏幕的渲染;,但我需要将此场景渲染到另一个帧缓冲区(不是我的屏幕),以便将此渲染用作纹理。 因此,我设置了另一个帧缓冲区和一个输出纹理,现在我将此场景重新定义为帧缓冲区,除了帧缓冲区和视口大小(设置为与输出纹理匹配)之外,没有任何更改。为了演示我正在经历的错误,我将渲染这个渲染的纹理,渲染到一个平面上,然后显示在屏幕上 当网格从正x轴旋转,并围绕y轴旋转,以其原点为中心,介于-0.5πrad和0.5πrad之间时,渲染纹理看起来与渲染到屏幕时的结果完全相同,如上图所示 但是,当围绕y轴的旋转大于0.5πrad或小于-0.5πrad时,越靠近摄影机的山丘在距离摄影机平面越远的后面渲染,可以通过查看颜色来证明山丘离摄影机越近的事实,该颜色表示: 哎呀,窗户上的标题搞错了,别理它 在沿y轴旋转接近0.5πrad或-0.5πrad的边界区域中,场景如下所示 哎哟,窗户上的标题又错了,别理它重述。此深度排序错误仅在使用帧缓冲区渲染纹理时发生,并且仅在从特定角度查看对象时发生。当对象直接渲染到屏幕时,不会发生错误。因此,我的问题是:为什么会发生这种情况,以及如何避免这种情况。如果此问题仅在渲染纹理帧缓冲区时发生,则可能没有与之正确链接的深度附件 确保在FBO初始化期间也将其链接到深度纹理。 有一个很好的例子说明了如何做到这一点
此外,请检查您用于渲染的所有矩阵-我在过去有过几次不正确的矩阵导致深度计算失败的情况。第一张图片…看起来不像正交投影。在我看来,它像一个透视投影。它是深度纹理/缓冲区,没有链接到正确的帧缓冲区。