如何在遥远的相机处理浮点错误?

每当摄像机“远”(它的位置是一些“大”vector)时,在渲染物体时会产生麻烦:这是从减去2个浮点数之后经典的精度损失。

我知道这些方法:

  • 使用双打进行投影/观看转换(在移动设备上可能不可行/可能),
  • 在CPU上执行减法 (使用双精度或整数),并将对象的(相对)位置上传到着色器中。 然后将该位置vector添加到要在顶点着色器中变换的vector,
  • 调整相机视图matrix或模型matrix 。 这些matrix然后在CPU上合并并上传。

这些方法如何比较? 我错过了其他一些方法吗?

我想你可以看看Infinity Engine(现在的I-Novae Engine)是如何解决这个问题的。 (不幸的是,我找不到博客文章了。)

首先,引擎保持多个层次的分辨率,取决于对象的重要性。 对于最外层的比例,它使用128位浮点,这足以在米级可靠地建模太阳能系统。 (我没有做math…)

根本的问题是,任何行星的规模,即使是32位的浮点数都开始迅速地解决问题。 但另一方面,使用除32位浮点数以外的其他任何东西来渲染都是非常慢的。 (至less是时候了)由于他们想要“无限”的视野距离,这就成了一个真正的问题。

他们用三种方法解决了这个问题:

首先引擎创建一个独立的渲染场景,以相机为中心。 这确保了精确度正确放置的小物件。 (很less的细节在程序上填写。)

像空间站,行星或整个星云这样真正大而远的物体是分开渲染的。 在许多情况下,它们被缩放,以便它们适合于32位浮点数的范围。 然后用广告牌把它放到最后的场景中。

最后,使用对数比例提交比一定阈值更远的所有内容。 这主要是为了保持邻近物体的z缓冲区分辨率,同时仍然能够在天然气巨人面前呈现空间站。