行星渲染的最佳CLOD方法

Best CLOD Method for Planet Rendering

本文关键字:CLOD 方法 最佳 行星      更新时间:2023-10-16

我现在正在做我的论文,这是一个渲染行星大小地形的引擎。

我还在完成我的研究,我遇到了很多关于这个主题的东西,问题是我不能决定我应该使用哪种LOD方法。

我知道geomipmapping,几何clipmaps (GPU)和Ulrich的块LOD在大型地形上工作良好,可用于渲染立方体的6个面,然后通过这种方法"球体化"立方体,我了解如何在GPU上使用c++/OpenGL/GLSL实现所有这些方法(使用方法如ROAM或任何其他不使用立方体的方法是我无法达到的,因为纹理是一种痛苦)。

所以,我没有时间去实现所有的方法,看看哪一个是最好的,更适合行星规模,我在这里问,看看是否有人做了这种比较,并帮助我决定我应该实现和使用哪种方法(我的导师有点疯狂,想让我用二十面体做一些事情,但我不能理解这种方法,除非使用ROAM)

无论如何,如果你能帮助我决定或有任何其他建议或方法,我真的很感激。一个条件是该方法应该能够实现GPU端(至少大部分),以防止CPU瓶颈。

另一个请求是,我知道在地形中获得大量细节时,有关于浮点数精度的数值问题,我不知道如何解决它,我在论坛上阅读了一个解决方案,但无法理解如何实现,我失去了对该线程的跟踪,我想知道如何解决这个精度问题。

PD:对不起我的英语。

[EDIT]我目前正在阅读一些矩阵变换来解决浮点精度,z战斗问题,挫折与动态z值的筛选,以及块的数据表示(使用带有浮点数的补丁空间及其在世界坐标中的位置为double),所以我认为我可以轻松解决精度问题。我还需要比较一下LOD方法和你的意见和建议,来决定哪个更适合这个项目。考虑到实现难度、视觉质量和性能,我想要最好的。

我忘记提到的是生成是混合的,我的意思是,我应该能够完全使用GPU渲染行星(在飞行中计算高度)和/或使用基本高度图图像并使用GPU添加细节(顶点着色器)。纹理将是一个侧面部分,我将麻烦后,现在我很高兴只使用颜色取决于高度,或者可能使用在片段着色器上生成的某种噪声纹理。

最后,经过大量的研究,我可以得出结论,正如之前有人说的那样,没有普遍的"最佳"方法。但我的研究使我了解了以下事情:

取决于你最终使用的网格:

  • 球面化立方体:任何有四叉树实现的LOD方法都可以很好地工作,你只需要注意特殊情况,比如面之间的边界,在这种情况下,你的四叉树必须有一个指针指向相邻面的每一层的邻居。
  • 其他:我认为ROAM(较新的2.0版本或任何其他扩展,如BDAM, CABTT或RUSTIC)会做得很好,然而,这些算法很难使用,需要更多的内存,并且比其他使用立方体的方法慢一点。

有很多LOD方法可以很好地适应,但我个人最喜欢的5个是:

  1. 连续距离相关LOD (CDLOD)
  2. 基于GPU的几何体剪贴图(GPUGCM)
  3. 分组LOD
  4. 使用OpenGL GPU镶嵌渲染地形(书:OpenGL Insight, Chapter 10)
  5. 几何产生

每个都提供了一种独特的方式来渲染地形,例如,CDLOD使用着色器(GLSL或HLSL)有一个非常容易的实现,但也能够在CPU(传统硬件)上实现,然而Planet Rendering的目标是在现代GPU上爆炸最好的,所以当你想挤压你的GPU时,GPUGCM是最好的。它们都可以很好地处理基于数据的、程序的或混合的(基于固定数据的地形或添加了程序工作的高度图和细节)大型地形渲染。

也存在基本几何Clipmaps方法的球面扩展,但存在一些问题,因为高度图的平面样本必须使用球坐标进行参数化。

另一方面,块LOD对于传统硬件来说是完美的,不需要任何GPU端计算工作,它非常适合大型数据集,但不能实时处理过程数据(也许经过一些修改,它可以)

使用镶嵌着色器是另一种技术,非常新的,因为opengl4。x出来了,在我看来它可能是最好的,但是,我们正在谈论行星渲染,我们遇到了一个问题,其他方法可以很容易地处理,它是关于精度。

除非你只希望你的精度是1Km之间的垂直,选择镶嵌着色器。用这种方法处理真正大的地形的问题是抖动很难解决(或者至少对我来说,因为我是镶嵌着色器的新手)。

Geomipmapping是一项伟大的技术,利用了四分树的优势,具有较低的投影像素误差,但是,对于行星渲染,你将需要设置至少16+级的细节,这意味着你将需要(为了拼接目的)一些额外的补丁来连接不同的水平,并照顾你的邻居的水平,这可能是繁琐的解决,特别是使用6个地形面。

还有另一种方法,非常特别:"行星地形的投影网格映射"非常适合可视化,但有其缺点,如果你想了解更多,请访问链接。

问题:

  • 抖动:目前大多数gpu只支持32位浮点值,这是一个很大的问题不能提供足够的精度来操纵行星尺度地形中的大位置。当观看者放大并旋转或移动时,会出现抖动,然后多边形开始来回反弹。

    最好的解决方案是使用"渲染相对于眼睛使用"方法。这种方法在"3D引擎"一书中有描述《虚拟地球仪的设计》(我相信你可以在网上找到基本上你需要设置所有的位置双倍CPU(补丁,剪贴图,对象,挫折,相机等)然后MV通过设置翻译以观众为中心到(0,0,0)T和双精度数在一个定点中编码使用两个浮点数的分数(尾数)位表示,low通过一些方法(阅读使用Ohlarik的实现)和DSFUN90 Fortran库).

    虽然顶点着色器只需要额外的两个减法和加法,GPU RTE加倍顶点的数量位置所需的缓冲内存。这并不一定会翻倍内存需求,除非只存储位置。

  • 深度缓冲精度: Z-fighting。当我们渲染非常大的地形时,在这种情况下:行星,z缓冲区必须很大,但无论你为znear和zfar设置哪个值,都会出现问题。

    因为z缓冲区依赖于浮点间隔,而且它也是线性(虽然透视投影是非线性的)值附近由于缺乏32位精度,眼睛会受到z轴战斗的影响漂浮。

    解决这个问题的最好方法是使用"对数深度"缓冲区"http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html

    一个对数深度缓冲区提高了深度缓冲区的精度远距离对象采用对数分布为zscreen。它将近距离对象的精度转换为远距离对象的精度。由于我们使用LOD方法进行渲染,远对象需要的更少精度,因为它们有更少的三角形。

值得一提的是,由于四叉树基础,列出的所有方法(除了投影网格)在处理物理(主要是碰撞)时都非常好,如果你计划制作游戏,这是必须的。

总之,只要检查所有可用的选项,然后选择一个你觉得更舒服的,在我看来,CDLOD做得很好。不要忘记解决抖动和z轴缓冲问题,最重要的是:享受制作的乐趣!

有关LOD的更多信息,请查看此链接。

关于球化立方体的完整演示,请查看此链接。

有关解决抖动和Z-Buffer精度的更好解释,请参阅这本书。

我希望这篇小复习对你有用。