哪种方法最适合渲染星球?


23

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

我仍在完成研究,并且遇到了很多与此主题有关的问题,但问题是我无法确定应该使用哪种详细程度(LOD)方法。

我了解Ulrich的geomipmapping,几何剪贴图(GPU)和分块LOD,它们在较大的地形上都能很好地工作,并且可以用于渲染多维数据集的6个面,然后通过此方法 “球形化”多维数据集,并且我了解如何实现所有这些在GPU上使用C ++ / OpenGL / GLSL的方法(使用ROAM之类的方法或任何其他不使用多维数据集的方法都无法使用,因为纹理化是很麻烦的)。另外我最近也在这里学习了使用镶嵌细分着色器渲染地形的教程。

因此,我没有时间去实现所有方法,而是看看哪种方法最合适,更适合于行星尺度,我在这里询问是否有人进行了这种比较,并帮助我确定了哪种方法我应该实现和使用吗(我的导师有点疯狂,想让我用二十面体做某事,但是除非使用ROAM,否则我无法理解该方法)

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

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

我目前正在阅读有关一些矩阵转换的信息,以解决浮点精度,z对抗问题,使用动态z值进行视锥剔除以及大块的数据表示(使用具有浮点的补丁空间及其在世界坐标中的位置为double)我认为我可以轻松解决精度问题。我仍然需要在LOD方法与您的意见和建议之间进行比较,以决定哪种方法更适合该项目。考虑实施难度,视觉质量,性能,我想要最好的。

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


6
没有普遍的“最佳”方法。只有您知道项目的所有要求,并且您似乎知道许多LOD选项。最后,由于这是论文的一部分,因此您应该真正自己做出决定。您的论文将显示您对所研究主题的知识。如果您不知道哪个最适合您的需求,也许您应该多研究一些选择。
MichaelHouse

@ Byte56你是对的,我正在研究很多LOD方法,我只是想看看其他人的一些建议,他们已经实现了其中的一些建议,并讨论了性能和视觉质量,所以我还是可以选择一个...谢谢,谢谢供您评论:)顺便说一下,我目前了解曲面细分着色器,并找到了一个不错的教程(主要问题的链接),我想我会去做的,它仅用于地形渲染,但我可以对其进行修改制作6个面并将球体球形化。
nosmirck,

vterrain.org/LOD具有有关地形渲染主题的大量信息。链接的部分列出了详细算法级别的论文和其他资源。vterrain.org/LOD/spherical.html处理球形网格(例如行星)。
2013年

@sarahm我知道,这是我的起点,我全部都加了红。。。我只需要在一些LOD方法之间进行比较,以选择哪种工具,我就可以全部完成,但我没有时间...反正,我将使用镶嵌细分着色器的方法,它是新事物,并且在球面上没有实现:)
nosmirck

3
我知道您已经进行了很多研究,并且不确定是否已经在您的桌面上找到了,但是看看“虚拟地球仪的3D引擎设计:Patrick Cozzi和Kevin Ring”-我发现了很多那里有很多实用的信息 如前所述,它经过了充分的研究,并从非常实际的角度出发。HTH以某种方式。
Schoenobates

Answers:


17

最后,经过大量研究,我可以得出结论,就像以前有人说的那样,没有普遍的“最佳”方法。但是我的研究使我了解了以下方面:

最终取决于网格,您将使用:

  • Spherified Cube:任何具有四叉树实现的LOD方法都可以正常工作,您只需要注意一些特殊情况,例如面之间的边界,在这种情况下,您的四叉树必须在每个相邻的面中都有一个指向邻居的指针。
  • 其他问题:我认为ROAM(2.0版或BDAM,CABTT或RUSTIC的其他任何扩展)效果很好,但是,这些算法很难使用,需要更多的内存,并且比其他使用多维数据集的方法要慢一些。

有很多适合的LOD方法,但我个人的前5个方法是:

  1. 连续距离相关的LOD(CDLOD)
  2. 基于GPU的几何裁剪图(GPUGCM)
  3. 块状LOD
  4. 使用OpenGL GPU细分渲染地形(书籍:OpenGL Insight,第10章)
  5. 几何贴图

每一种都提供了一种独特的渲染地形的方法,例如,CDLOD使用着色器(GLSL或HLSL)可以非常轻松地实现,但是也可以在CPU(对于旧硬件)上实现,但是Planet Rendering的目标是将在现代GPU上是最好的,因此当您要挤压GPU时,GPUGCM是最好的。它们都适用于大型地形的基于数据的,过程的或混合的(基于固定数据或高度图的地形以及通过过程工作添加的细节)效果。

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

另一方面,块状LOD非常适合旧式硬件,不需要任何GPU端计算即可工作,非常适合大型数据集,但不能实时处理过程数据(可能进行了一些修改,可以)

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

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

Geomipmapping是一种很棒的技术,它利用四叉树的优势并且具有较低的投影像素误差,但是,对于行星渲染,您将需要设置至少16层以上的细节,这意味着(为了缝合目的)您将需要一些额外的补丁连接不同级别并照顾邻居的级别,这可能很麻烦,尤其是使用6个地形面时。

还有另一种方法,它本身非常特殊:“行星地形的投影网格映射”非常适合可视化,但是有其缺点,如果您想了解更多信息,请转到链接。

问题:

  • 抖动:当今的大多数GPU仅支持32位浮点值,这不能提供足够的精度来处理星球级地形中的大位置。观看者放大,旋转或移动时会发生抖动,然后多边形开始来回反弹。

    最好的解决方案是使用“使用GPU渲染相对于眼睛的效果”方法。《虚拟地球仪的3D引擎设计》一书(我相信您也可以在Internet上找到)中对此方法进行了说明,在该方法中,基本上必须将CPU的所有位置(修补程序,剪贴图,对象,然后将MV通过将其平移设置为(0,0,0)T来将MV置于查看器的中心,并使用两个浮点的小数(尾数)位将双打编码为定点表示并通过某种方法提高了(阅读有关使用Ohlarik的实现和DSFUN90 Fortran库的信息)。

    尽管顶点着色器仅需要额外的两个减法和一个加法,但是GPU RTE使位置所需的顶点缓冲内存增加了一倍。除非仅存储位置,否则这不一定会使内存需求增加一倍。

  • 深度缓冲区精度:Z值战斗。在这种情况下,由于我们要绘制非常大的地形:行星,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精度的更好说明,请参阅本书

希望这篇小评论对您有所帮助。


1
我很想了解您的研究历程。无论如何,我可以跟踪您的更新吗?博客还是什么?
Syaiful Nizam Yahya 2014年

@publicENEMY现在,我仍在开发引擎,我停了下来,因为我得到了一份工作,并且研究工作待命,一两个月后我将重新进行研究并完成引擎。当我到达那里时,我将在此发布所有旅程的更新,并在此通知您。感谢您的关注。
nosmirck 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.