当渲染到帧缓冲而不是屏幕

时间:2017-07-25 13:05:02

标签: opengl 3d framebuffer depth-testing

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

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);)来完成的,但我需要将此场景渲染到另一个不是我的屏幕的帧缓冲区,以便使用此渲染作为纹理。
所以我已经设置了另一个帧缓冲区和输出纹理,现在我将这个场景渲染到帧缓冲区(除了帧缓冲区和视口大小,设置为匹配输出纹理之外,绝对没有任何改变)。为了演示我正在尝试的错误,然后我将渲染的纹理呈现在一个平面上,然后显示在屏幕上。

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

然而,当围绕y轴的旋转大于0.5π弧度或小于-0.5πrad时,更接近相机的山丘将在更远离相机的平面后面呈现(事实上可以通过观察颜色来证明山更接近相机,这代表了深度):

enter image description here

(哎呀,窗户上的标题错了,忽略了)

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

enter image description here

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

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

1 个答案:

答案 0 :(得分:1)

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

确保在FBO初始化过程中您也将其链接到深度纹理。 这是here的一个很好的例子。

另外,检查您使用的所有矩阵进行渲染 - 过去我曾经遇到过几个不正确的矩阵抛出深度计算的情况。