Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当渲染到帧缓冲区而不是屏幕时,OpenGL深度排序在单个网格上失败_Opengl_3d_Framebuffer_Depth Testing - Fatal编程技术网

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

当渲染到帧缓冲区而不是屏幕时,OpenGL深度排序在单个网格上失败,opengl,3d,framebuffer,depth-testing,Opengl,3d,Framebuffer,Depth Testing,作为我问题的一个简单演示,我尝试将一个大但简单的网格渲染为一个纹理,以供以后使用,但奇怪的是,当从特定角度观看时,该网格的离摄影机部分越远,显示在离摄影机部分越近的前面。尽管不可否认的事实是,我毫无疑问使用深度测试: glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); 作为一个例子,我试图在以原点为中心的XZ平面上绘制一个细分网格,在网格的中间有一个光滑的小山。 当渲染到屏幕时,不会发生错误,并且网格看起来与使用正交投影渲染的网格类似,并且使用表示深

作为我问题的一个简单演示,我尝试将一个大但简单的网格渲染为一个纹理,以供以后使用,但奇怪的是,当从特定角度观看时,该网格的离摄影机部分越远,显示在离摄影机部分越近的前面。尽管不可否认的事实是,我毫无疑问使用深度测试:

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS); 

作为一个例子,我试图在以原点为中心的XZ平面上绘制一个细分网格,在网格的中间有一个光滑的小山。

当渲染到屏幕时,不会发生错误,并且网格看起来与使用正交投影渲染的网格类似,并且使用表示深度的灰度颜色,即使从任何一侧查看网格,也不会发生错误:

当然,通过确保帧缓冲区设置为0 glBindFramebufferGL_framebuffer,0;,可以完成对屏幕的渲染;,但我需要将此场景渲染到另一个帧缓冲区(不是我的屏幕),以便将此渲染用作纹理。 因此,我设置了另一个帧缓冲区和一个输出纹理,现在我将此场景重新定义为帧缓冲区,除了帧缓冲区和视口大小(设置为与输出纹理匹配)之外,没有任何更改。为了演示我正在经历的错误,我将渲染这个渲染的纹理,渲染到一个平面上,然后显示在屏幕上

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

但是,当围绕y轴的旋转大于0.5πrad或小于-0.5πrad时,越靠近摄影机的山丘在距离摄影机平面越远的后面渲染,可以通过查看颜色来证明山丘离摄影机越近的事实,该颜色表示:

哎呀,窗户上的标题搞错了,别理它

在沿y轴旋转接近0.5πrad或-0.5πrad的边界区域中,场景如下所示

哎哟,窗户上的标题又错了,别理它


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

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

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


此外,请检查您用于渲染的所有矩阵-我在过去有过几次不正确的矩阵导致深度计算失败的情况。

第一张图片…看起来不像正交投影。在我看来,它像一个透视投影。它是深度纹理/缓冲区,没有链接到正确的帧缓冲区。