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

OpenGL depth sorting fails on single mesh, when rendering to framebuffer instead of screen

作为我的问题的简单演示,我试图将一个大而简单的网格渲染到纹理以供稍后使用,但奇怪的是,这个网格的 further-away-from-the-camera 部分显示在前面closer-to-the-camera 部分,从特定角度看。尽管不可否认的事实是我毫无疑问地使用了深度测试:

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS); 

例如,我正在尝试渲染一个以原点为中心的细分网格(在 xz 平面上),网格中间有一个平滑的 "hill"。

渲染到屏幕上没有错误发生,网格看起来像这样(使用正交投影渲染,灰度颜色代表深度,即使从任何一侧查看网格也不会发生错误):

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

当从正 x 轴方向旋转网格并绕 y 轴旋转时,以其原点为中心在 -0.5 π rad 和 0.5 π rad 之间,渲染的纹理看起来与渲染到的结果完全相同屏幕,如上图所示。

然而,当围绕 y 轴的旋转大于 0.5 π 弧度或小于 -0.5 π 弧度时,closer-to-the-camera 山丘被渲染在 further-away-from-the-camera 平面后面(事实上,山丘更接近可以通过查看代表债务的颜色来证明对相机的影响):

(糟糕 window 上的标题错了,请忽略)

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

(哎呀又在 window 上弄错了标题,再次忽略它)

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

如果此问题仅在您渲染到纹理帧缓冲区时发生,则您可能没有正确链接到它的深度附件。

确保在 FBO 初始化期间您也将其链接到深度纹理。 有一个很好的例子来说明如何做到这一点 here.

此外,请检查您用于渲染的所有矩阵——我过去遇到过几个不正确的矩阵导致深度计算失败的案例。