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

我遇到的问题是另一个程序具有某种“伪”字形 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 是指它们将相机定位得足够远(以及较小的角度以缩放场景),使得“视线”(由于缺乏更好的用语)几乎平行,就像在真实情况下一样。正射投影。

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

因此,我的问题是我可以通过哪些方式更改深度测试,以使缓冲区偏向远平面?或类似的规定。我尝试将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上使用(驱动程序不支持较旧的系列)。

10-08 01:03