OpenGL深度排序在单个网格上失败时,渲染到帧缓冲而不是屏幕

问题描述:

作为我的问题的简单演示,我试图渲染一个大而简单的网格到稍后使用的纹理,但奇怪的是,进一步从特定角度观看时,此网格的相机部分会从靠近相机的部分显示。尽管不可否认的事实是我做的毫无疑问的使用深度测试:OpenGL深度排序在单个网格上失败时,渲染到帧缓冲而不是屏幕

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LESS); 

举个例子,我试图呈现一个细分网格(在XZ平面)为中心的起源,具有光滑的“山”在电网中间。

当呈现给没有错误发生屏幕和网状看起来像这样(渲染使用正投影,并且与灰度颜色代表深度,即使网由任何一侧观察将进一步发生错误):

Rendering directly to screen, no errors occur, even when mesh is rotated

渲染到屏幕当然是通过确保帧缓冲区设置为0(glBindFramebuffer(GL_FRAMEBUFFER, 0);)来完成的,但我需要渲染这个场景到另一个场景的帧缓冲这是不是我的屏幕,才能使用此渲染作为纹理。
所以我已经设置了另一个framebuffer和一个输出纹理,现在我正在将这个场景重新渲染到framebuffer(除了framebuffer和视口大小设置为与输出纹理相匹配外,没有任何更改)。为了演示我正在尝试的错误,然后将该渲染的纹理渲染到屏幕上显示的平面上。

当网格从正x轴旋转看,并围绕y轴旋转时,以其原点为中心在-0.5π弧度和0.5π弧度之间,呈现的纹理看起来与渲染到屏幕,如上图所示。

然而,当围绕y轴旋转大于0.5π弧度或小于-0.5π弧度时,更靠近相机的小山位于离相机更远的平面之后(事实上这山更接近摄像机可以通过看颜色,它代表debth)得到证实:

enter image description here

(哎呦得到了标题错了窗户上,忽略了)

在绕y轴旋转的边界区域接近0.5π弧度或-0.5π弧度,场景看起来像这样。

enter image description here

(哎呦再次拿到了冠军错误的窗口上,再次忽略)

回顾一下。只有在使用帧缓冲区渲染到纹理时,以及仅当从特定角度查看对象时,才会发生深度排序错误。当对象直接渲染到屏幕上时,不会发生错误。我的问题是:为什么会发生这种情况,以及如何(如果有的话)我可以避免避免它。

+0

第一张照片......看起来不像一个正交投影。它看起来像一个透视投影给我。 –

如果只有在渲染到纹理帧缓冲区时才会出现此问题,那么您可能没有正确链接到该纹理的深度附件。

确保在FBO init期间,您还将它链接到深度纹理。 有一个很好的例子,如何做到这一点here

另外,检查你用来渲染的所有矩阵 - 过去我曾经有过几种不正确的矩阵抛出深度计算的例子。

+0

这是深度纹理/缓冲区没有链接到右边的framebuffer。 – Nikolaj