作为我的问题的一个简单演示,我试图将一个大而简单的网格渲染到一个纹理以供以后使用,但奇怪的是,这个网格的远离相机的部分显示在前面从特定角度观察时,更靠近相机的部分。尽管不可否认的事实是我毫无疑问地使用深度测试:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
例如,我试图渲染一个以原点为中心的细分网格(在 xz 平面上),网格中间有一个平滑的“山丘”。
渲染到屏幕上时不会出现错误,网格看起来像这样(使用正交投影渲染,灰度颜色代表深度,即使从任何一侧查看网格也不会出现错误):
渲染到屏幕当然是通过确保帧缓冲区设置为 0 ( glBindFramebuffer(GL_FRAMEBUFFER, 0);
) 来完成的,但是我需要将此场景渲染到另一个不是我的屏幕的帧缓冲区,以便将此渲染用作纹理。
所以我设置了另一个帧缓冲区和一个输出纹理,现在我将这个场景重新渲染到帧缓冲区(除了帧缓冲区和视口大小设置为匹配输出纹理之外,几乎没有任何变化)。为了演示我正在经历的错误,然后我将这个渲染的纹理渲染到一个平面上,然后显示在屏幕上。
当网格从正 x 轴旋转并围绕 y 轴旋转时,以 -0.5 π rad 和 0.5 π rad 之间的原点为中心,渲染的纹理看起来与渲染到屏幕时的结果完全相同,如图所示在上图中。
然而,当绕 y 轴的旋转大于 0.5 π rad 或小于 -0.5 π rad 时,靠近相机的山被渲染在远离相机的平面后面(事实上山是更接近相机可以通过查看颜色来证明,这代表了债务):
(哎呀,窗口上的标题错误,忽略它)
在围绕 y 轴旋转接近 0.5 π rad 或 -0.5 π rad 的边界区域中,场景看起来像这样。
(哎呀,窗口上的标题又错了,再次忽略它)
回顾一下。这种深度排序错误仅在使用帧缓冲区渲染到纹理时发生,并且仅在从特定角度查看对象时发生。当对象直接渲染到屏幕上时,不会发生错误。我的问题是:为什么会发生这种情况,以及我如何(如果有的话)避免它。