精确的问题与逼真的行星/地形

最近我一直在做一个现实的缩放行星引擎。 我发现了几个有关如何做的有趣链接,以后会出现什么问题,以及如何解决这些问题。 我采取的方法是我在许多文章中find的方法:使用6个四边形,每个面对一个,然后将立方体变成一个球体。

我的四叉树逻辑似乎正在工作,我试图在一个平坦的地形和一个球体(合理的距离),它运作良好,然后我尝试了更大的距离。

第一个问题是z战斗,使用对数深度缓冲区( http://outerra.blogspot.fr/2009/08/logarithmic-z-buffer.html )修复。 第二个是大数字的浮点精度。

我读了两个主要的方法来解决它。 第一个是使用双打而不是浮动进行操作,并给予相对于相机空间的每个位置。 二是在不同的单位中使用不同的空间(物体空间米,行星空间公里,非盟太阳系空间等)。 虽然第二个被许多人鼓励,我拿了第一个,因为它似乎更容易做到。 无论如何,我打算在未来尝试第二个。

第一种方法在平面地形上工作,因为它很容易计算出相对于相机的位置(centerOfNode – cameraPos)。 我仍然有一个错误是关于高度。 我在GPU上使用3D单工噪声,它使用浮点运算,需要vec3input。 相对较小的距离,世界的地位很好。 距离很远,世界空间位置在离原点很远的地方不起作用,由于缺less精度,模式很奇怪。 当然,它不能用于摄像机空间位置作为input。 我没有find任何关于这个。 上面的第二种方法是明天我会尝试的。 也就是说,用不同的单位定义几个空间,在每个空间中转换位置,并将它们中的每一个用作单纯的噪声函数的input,这将给我几个我可以用来进行缩放的纹理。 我不知道我会怎么做细节,但我认为这是行不通的,因为从低处转换到高处可能会导致浮点错误。 我可以用双精度的单工噪声dynamic地在CPU中创建顶点,但是听起来不太合适…我想尽可能地使用GPU,除非我没有别的select。

我的第二个问题是这次是球形地形。 所以我的步骤来得到这个星球是:

1)从四叉树节点,缩放,旋转和平移单位四元到他在六叉树当前平面的位置

2)使其正常化

3)乘以半径得到海平面的球体

4)增加高度

由于第一步与地球的起源有关,所以即使在视野空间也需要大数(半径)的操作,所以我不知道如何避免这里的精度问题……再次,我可以创建它们在CPU上并将它们发送给GPU,但是这听起来很累,我不想这样做,除非我没有其他合理的select。 我很乐意使用第二个解决scheme(几个空格),如果我有一个如何解决它的想法,但我不知道如何做到这一点…