我有一个正在研究的项目是从模拟中制作电影.模拟从另一个定义投影矩阵的程序传递.
我遇到的问题是另一个程序有一种"假的"正交视图,我的意思是它的投影矩阵如下:
PerspectiveMatrix = glm::perspective(3.5, 1, 1.0f, 50.0f);
Run Code Online (Sandbox Code Playgroud)
它使用LookAt函数:
ViewMatrix = glm::lookAt(
(2000,-3000,2000), // eye
(0,0,0), // center
(0,0,1)//up
);
Run Code Online (Sandbox Code Playgroud)
所以我的意思是'假的'正交视图是他们已经将相机定位得足够远(和小角度来放大场景),"视线"(缺少更好的术语)几乎是平行的正投影.
所以这一切都很好,但是我遇到了,并且在另一个程序中也是一个问题,就是所有的高精度深度测试都靠近相机,在我的情况下,这是空的空间.这意味着有很多z战斗,如下面的链接所示:

所以我的问题是我可以通过哪些方式更改深度测试,以便将缓冲区偏向远方平面?或类似的规定.我已经尝试将NearPlane移动得更远,这会导致屏幕缩小,所以我在视角中用较窄的角度进行补偿.但是这样做足够的时间会使问题变得更糟,没有z战斗,但它并没有在正确的深度上绘制东西.球体最终位于一切之上.
我发现在Outerra一些信息: http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html 他们有一些想法扭转了深度缓冲,但它是Nvidia的具体,我需要与ATI和Nvidia兼容
该博客文章中描述的对数深度和反向深度映射都适合您。
反浮点比较好,在DirectX中工作正常。在OpenGL中,由于设计缺陷,它不会给你带来任何额外的精度,除非驱动程序公开了NV_depth_buffer_float扩展,通过它你可以有效地关闭使其无法正常使用的偏差。
AMD 自 13.12 Catalyst 驱动程序起就支持该扩展,因此该技术可在所有 5000+ 系列 AMD GPU 上使用(驱动程序不支持较旧的系列)。