行星渲染的最佳CLOD方法

时间:2013-05-11 07:06:08

标签: c++ opengl rendering terrain level-of-detail

我正在研究我的论文,它是一个渲染行星大小地形的引擎。

我还在完成我的研究,我遇到了很多关于这个问题的东西,问题是我无法决定使用LOD方法。

我知道有关地形图,几何图形图(GPU)和Ulrich的分块LOD,它们适用于大型地形,可用于渲染多维数据集的6个面,然后通过this method“我”对立方体进行“球化”了解如何使用C ++ / OpenGL / GLSL在GPU上实现所有这些方法(使用ROAM之类的方法或任何其他不使用多维数据集的方法都是我无法实现的,因为纹理是一种痛苦)。

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

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

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

PD:抱歉我的英文。

[编辑]我目前正在阅读一些矩阵变换来解决浮点精度,z-fighting问题,使用动态z值进行截顶剔除以及块的数据表示(使用具有浮点数的补丁空间及其位置)世界坐标为双)所以我认为我可以轻松解决精度问题。我仍然需要将LOD方法与您的意见和建议进行比较,以确定哪个更适合这个项目。考虑到实施的难度与视觉质量和性能的关系,我想要最好的。

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

1 个答案:

答案 0 :(得分:21)

最后,经过大量的研究,我可以得出结论,正如之前所说的那样,没有普遍的"最好的"方法。但是我的研究让我了解了以下几点:

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

  • Spherified Cube:任何使用四叉树实现的LOD方法都可以正常工作,你只需要注意面部之间的边界等特殊情况,在这种情况下,你的四叉树必须有一个指向每个级别的邻近面的邻居。
  • 任何其他:我认为ROAM(较新的版本2.0或任何其他扩展名为BDAM,CABTT或RUSTIC)会很好用,但是,这些算法难以使用,需要更多内存和比使用立方体的其他方法慢一点。

有许多LOD方法可以很好地适应,但我的个人前5名是:

  1. Continous Distance-Dependent LOD (CDLOD)
  2. GPU Based Geomety Clipmaps (GPUGCM)
  3. Chunked LOD
  4. 使用OpenGL GPU Tessellation渲染Terrains(书:OpenGL Insight,第10章)
  5. Geometrical MipMapping
  6. 每个人都提供了一种渲染地形的独特方式,例如,CDLOD使用着色器(GLSL或HLSL)非常容易实现,但也可以在CPU上实现(对于传统硬件)但是Planet Rendering的目标是在现代GPU上爆炸最好,所以当您想要挤压GPU时,GPUGCM是最好的。它们都可以很好地处理基于数据,程序或混合(基于固定数据或高度图的地形以及添加了程序性工作的细节)渲染大地形。

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

    另一方面,Chunked LOD非常适合传统硬件,不需要任何GPU端计算,它适用于大型数据集但不能真正处理实际的程序数据时间(可能有一些修改,可能)

    使用Tessellation着色器是另一种技术,非常新,因为OpenGL 4.x问世,在我看来它可能是最好的,但是,我们谈论的是Planet Rendering,我们遇到的问题是其他方法可以很容易处理这是关于精确度。

    除非您只希望精度在顶点之间为1Km,否则请选择曲面细分着色器。使用这种方法真正大地形的问题是抖动很难解决(或者至少对我而言,因为我是曲面细分着色器的新手)。

    Geomipmapping是一项很棒的技术,利用了四叉树并且投影像素误差很小,但是,对于行星渲染,您需要设置至少16级以上的细节,这意味着您需要(用于缝合pourposes)一些额外的补丁来连接不同级别并照顾你的邻居级别,这可能很难解决,特别是使用6个地形面。

    还有另一种方法,非常特别:"Projective Grid Mapping for Planetary Terrain"非常适合可视化,但有其缺点,如果你想了解更多,请转到链接。

    <强>问题:

    • 抖动:今天的大多数GPU只支持32位浮点值, 没有提供足够的精度来操纵行星尺度地形中的大位置。当观察者放大并旋转或移动时发生抖动,然后多边形开始来回反弹。

      对此最好的解决方案是使用&#34;渲染相对于眼睛使用 GPU&#34;方法。这种方法在书籍#34; 3D引擎中有所描述 虚拟地球仪的设计&#34; (我相信你可以在互联网上找到它 在那里基本上你必须设置所有的位置 CPU上的双打(补丁,剪贴图,对象,截头,相机等) 然后通过设置其翻译,MV以观众为中心 到(0,0,0)T和双精度数在一个定点编码 使用两个浮点数的分数(尾数)位表示低 通过某种方法高(阅读有关使用Ohlarik的实现 和DSFUN90 Fortran库。)

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

    • 深度缓冲精度:Z-fighting。当我们渲染非常大的地形时,在这种情况下:行星,Z缓冲区必须是巨大的,但是你为znear和zfar设置的值并不重要,总会有问题。

      由于Z缓冲区取决于浮点间隔,它也是 线性(尽管透视投影是非线性的)值接近 由于缺乏精确的32位,眼睛遭受Z战斗 花车有。

      解决此问题的最佳方法是使用&#34;对数深度 缓冲器&#34; http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html

      对数深度缓冲区可提高深度缓冲区精度 通过使用zscreen的对数分布来远程对象。它 交易关闭对象的精度,以获得远距离物体的精度。 由于我们使用LOD方法进行渲染,因此远程对象需要的更少 精度,因为它们的三角形较少。

    值得一提的是,所有列出的方法(投影网格除外)在进行物理(大部分碰撞)时非常好,因为Quadtree基础,如果你打算制作游戏,这是强制性的。

    总之,只需检查所有可用的选项,然后选择您感觉更舒适的选项,在我看来CDLOD做得很好。不要忘记解决抖动和Z缓冲问题,最重要的是:玩得开心!

    有关LOD检查的更多信息this link

    有关对多维数据集进行球形化的完整演示,请检查this link

    有关解决抖动和Z缓冲区精度的更好解释,请检查this book

    我希望你发现这篇小评论很有用。