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
C++ 增加远离摄影机的深度缓冲区精度_C++_Opengl - Fatal编程技术网

C++ 增加远离摄影机的深度缓冲区精度

C++ 增加远离摄影机的深度缓冲区精度,c++,opengl,C++,Opengl,我有一个项目,我正在工作,这是从一个模拟电影。模拟从定义投影矩阵的另一个程序传递 我遇到的问题是另一个程序有一种“假”正交视图,我的意思是它的投影矩阵如下所示: PerspectiveMatrix = glm::perspective(3.5, 1, 1.0f, 50.0f); 它使用LookAt函数: ViewMatrix = glm::lookAt( (2000,-3000,2000), // eye (0,0,0), // center (0,0,1)//u

我有一个项目,我正在工作,这是从一个模拟电影。模拟从定义投影矩阵的另一个程序传递

我遇到的问题是另一个程序有一种“假”正交视图,我的意思是它的投影矩阵如下所示:

PerspectiveMatrix = glm::perspective(3.5, 1, 1.0f, 50.0f); 
它使用LookAt函数:

ViewMatrix = glm::lookAt(
    (2000,-3000,2000), // eye 
    (0,0,0), // center 
    (0,0,1)//up 
);
因此,我所说的“假”正交视图的意思是,它们将相机放置在足够远的地方(并且角度很小,可以缩放场景),“视图线”(缺少更好的术语)几乎与真实正交投影中的平行

这一切都很好,但我遇到的,也是另一个程序中的一个问题,就是所有的高精度深度测试都离摄像机很近,在我的例子中,这是一个空白。这意味着有相当多的z战斗,如下面的链接所示:

所以我的问题是,为了使缓冲区偏向远平面,我可以用什么方法改变深度测试?或者类似的东西。我已经尝试将近平面移动得更远,这会缩小屏幕,因此我在透视图中用更窄的角度进行补偿。但如果这样做的次数足够多,问题会变得更糟,没有z战斗,但它没有把事情拉到正确的深度。球体最终位于所有物体之上

我确实在奥特拉找到了一些信息:
他们有一些反转深度缓冲区的想法,但它是Nvidia特有的,我需要与ATI和Nvidia兼容,中描述的对数深度和反转深度映射将适用于您

反向浮点更好,在DirectX中工作正常。在OpenGL中,由于设计缺陷,它不会给您带来任何额外的精度,除非驱动程序公开扩展,通过扩展,您可以有效地关闭使其无法正常使用的偏差


AMD从其13.12 Catalyst驱动程序开始支持该扩展,因此该技术可用于所有5000+系列AMD GPU(驱动程序不支持旧系列)。

比上述任何一种都简单:将您的znear从相机中移开。看起来它是glm::perspective()的第三个参数,在您的示例中设置为1.0。在开始剪切场景前景中的内容之前,将其设置为尽可能大的值,z缓冲区精度问题可能会消失


Reverse-float-z非常棒,但只适用于视野更宽、几何结构更深的场景。对于类似您的近正交场景,只需适当设置znear/zfar即可。

为什么不将相机移近一点并使用真正的正交投影?这肯定会解决深度问题,问题是我的程序需要看起来与“父”程序完全相同。它们都显示相同的图像,但我的是将它们写入AVI,而不是仅仅预览场景。基本上,用户预览屏幕以确保得到正确的结果,然后调用我的程序将其制作成电影。顺便说一句,翻转深度范围并不是NV特有的。事实上,你会发现,最响亮的支持者,埃米尔·佩尔森,为AMD工作了几年。如果你反转深度缓冲区并使用浮点表示,你可以得到非常好的结果。这不是真正的答案。可以使用不同的投影矩阵进行多次传递,然后合并结果。了解更多有关深度精度的信息。几天前,我刚刚完成了类似的任务,我只是查看了一些用于执行类似操作的代码,我注意到我没有在投影矩阵中交换剪辑平面,而是调用
gldeptrange(1.0f,0.0f)
。你可以考虑用我所描述的其他变化来尝试。