c++ - 提高远离相机的深度缓冲精度

标签 c++ opengl

我正在从事一个项目,该项目是通过模拟制作电影。模拟是从另一个定义投影矩阵的程序传递过来的。

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

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 
);

所以我所说的“假”正交 View 的意思是他们将相机放置得足够远(并且小角度缩放场景)以至于“ View 线”(缺少更好的术语)几乎平行在真正的正交投影中。

所以这一切都很好,但我遇到的,也是另一个程序中的一个问题,是所有高精度深度测试都靠近相机,而在我的情况下,这是空的空间。这意味着有相当多的 z 战斗,如下面的链接所示:

Screenshot

所以我的问题是我可以通过哪些方式改变我的深度测试,以便可能将缓冲区偏向远平面?或类似的规定。我试过将 NearPlane 移得更远,结果是缩小了屏幕,所以我在透视中用更窄的角度进行了补偿。但是这样做足够多次会使问题变得更糟,没有 z 战斗,但它不会在正确的深度绘制东西。球体最终位于一切之上。

我确实在 Outerra 找到了一些信息: http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html 他们有一些反转深度缓冲区的想法,但它是特定于 Nvidia 的,我需要与 ATI 和 Nvidia 兼容

最佳答案

blog post 中描述的对数深度和反向深度映射会为你工作。

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

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

关于c++ - 提高远离相机的深度缓冲精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23295481/

相关文章:

c++ - 如何获取从命令行参数调用的文件的目录?

c++ - 修改内容并将其添加到XML文件

c++ - Qt - 有没有办法在键入特定键时发出信号?

java - 提前更新场景,同时仍然渲染前一帧

opengl - 在 glBlendFunc() 中使用 GL_SRC1_COLOR

c++ - 我在编译代码时遇到一些问题

C++:打印/分配简单数组打印乱码

c++ - 两个 vector <string>串联

c++ - 无法在 OpenGL 中正确渲染图像/纹理,我做错了什么?

c++ - 为什么 VERTEX 着色器中的矩阵乘法无法正常工作?