0

作为我的问题的一个简单演示,我试图将一个大而简单的网格渲染到一个纹理以供以后使用,但奇怪的是,这个网格的远离相机的部分显示在前面从特定角度观察时,更靠近相机的部分。尽管不可否认的事实是我毫无疑问地使用深度测试:

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 的边界区域中,场景看起来像这样。

在此处输入图像描述

(哎呀,窗口上的标题又错了,再次忽略它)

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

4

1 回答 1

1

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

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

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

于 2017-07-25T19:21:12.930 回答