nos*_*rck 7 c++ opengl rendering terrain level-of-detail
我正在研究我的论文,它是一个渲染行星大小地形的引擎.
我还在完成我的研究,我遇到了很多关于这个问题的东西,问题是我不能决定使用LOD方法.
我知道有关地形图,几何图形图(GPU)和Ulrich的块状LOD,它们在大地形上工作得很好,可用于渲染立方体的6个面,然后通过这种方法 "球化"立方体,我理解如何实现所有这些方法在GPU上使用C++/OpenGL/GLSL(使用像ROAM这样的方法或任何其他不使用多维数据集的方法都是我无法实现的,因为纹理是一种痛苦).
所以,我没有时间实施所有的方法,看看哪一个是最好的,更适合行星规模,我在这里问一下是否有人进行了这种比较,并帮我决定哪种方法我应该实施和使用(我的导师有点疯狂,并希望我用二十面体做一些事情,但除非使用ROAM,否则我无法理解这种方法)
无论如何,如果你能帮我决定或有任何其他的建议或方法,我真的很感激.一个条件是该方法应该能够实现GPU端(至少大部分)以防止CPU瓶颈.
另一个要求是,我知道在地形中获取大量细节时,浮点数的精度存在数值问题,我不知道如何解决它,我在论坛中阅读了解决方案但无法理解如何实现,我忘记了该线程,我想知道如何解决这个精度问题.
PD:抱歉我的英文.
[编辑]我目前正在阅读一些矩阵变换来解决浮点精度,z-fighting问题,用动态z值进行的截顶剔除以及块的数据表示(使用具有浮点数的补丁空间及其在世界坐标中的位置为双)所以我认为我可以轻松解决精度问题.我仍然需要将LOD方法与您的意见和建议进行比较,以确定哪个更适合这个项目.考虑到实施的难度与视觉质量和性能的关系,我想要最好的.
我忘了提到的一点是,这一代是混合的,我的意思是,我应该能够完全使用GPU渲染行星(动态计算高度)和/或使用基础高度图图像并使用GPU(顶点着色器)添加细节.纹理将是我将为后者带来麻烦的一个侧面部分,现在我很高兴根据高度使用颜色,或者使用片段着色器上生成的某种噪声纹理.
nos*_*rck 21
最后,经过大量的研究,我可以得出结论,正如之前所说的那样,没有普遍的"最佳"方法.但是我的研究让我了解了以下事情:
根据您最终使用的网格:
有许多LOD方法可以很好地适应,但我的个人前5名是:
每个都提供了一种渲染地形的独特方式,例如,CDLOD使用着色器(GLSL或HLSL)非常容易实现,但也能够在CPU上实现(对于传统硬件),但是Planet Rendering的目标是爆炸最好的现代GPU,所以当您想要挤压GPU时,GPUGCM是最好的.它们都可以很好地处理基于数据,程序或混合(基于固定数据或高度图的地形和添加了程序工作的细节)渲染大地形.
此外,存在基本几何剪贴图方法的球面扩展,但存在一些问题,因为高度图的平面样本必须使用球面坐标进行参数化.
另一方面,Chunked LOD非常适合传统硬件,无需任何GPU端计算即可工作,它非常适合大型数据集,但无法实时处理程序数据(可能需要进行一些修改)
使用Tessellation着色器是另一种技术,非常新,因为OpenGL 4.x问世,在我看来它可能是最好的,但是,我们谈论的是Planet Rendering,我们遇到的问题是其他方法可以很容易处理,它是关于精度.
除非您只希望精度在顶点之间为1Km,否则请选择曲面细分着色器.使用这种方法真正大地形的问题是抖动有点难以解决(至少对我而言,因为我是曲面细分着色器的新手).
Geomipmapping是一项很棒的技术,利用了四叉树并且投影像素误差很小,但是,对于行星渲染,您需要设置至少16级以上的细节,这意味着您需要(用于缝合pourposes)一些额外的补丁要连接不同级别并照顾邻居的等级,这可能很难解决,特别是使用6个地形面.
还有另外一种方法,它本身非常特别:"行星地形的投影网格映射"非常适合可视化,但有其缺点,如果你想了解更多,请转到链接.
问题:
抖动:今天的大多数GPU仅支持32位浮点值,这不能提供足够的精度来操纵行星规模地形中的大位置.当观察者放大并旋转或移动时发生抖动,然后多边形开始来回反弹.
对此最好的解决方案是使用"使用GPU渲染相对于眼睛"方法.这个方法在"虚拟地球仪的3D引擎设计"一书中有所描述(我相信你可以在互联网上找到它)在哪里基本上你必须在CPU上设置所有的双打位置(补丁,剪贴图,对象,截头,相机等)然后MV通过将其平移设置为(0,0,0)T而以观察者为中心,并且使用两个浮点数的分数(尾数)位以固定点表示对双打进行编码,低通过某种方法获得高分(阅读使用Ohlarik的实现和DSFUN90 Fortran库).
虽然顶点着色器仅需要额外的两个减法和一个加法,但GPU RTE使位置所需的顶点缓冲存储器的数量加倍.除非只存储位置,否则这不一定会使内存需求翻倍.
深度缓冲精度:Z-fighting.由于我们渲染非常大的地形,在这种情况下:行星,Z缓冲区必须是巨大的,但是你为znear和zfar设置的值无关紧要,总会有问题.
由于Z缓冲区取决于浮点间隔,并且它也是线性的(尽管透视投影是非线性的)眼睛附近的值遭受Z战斗,因为缺少精确的32位浮点数.
解决此问题的最佳方法是使用"Logarithmic Depth Buffer" http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html
对数深度缓冲区通过使用zscreen的对数分布来提高远程对象的深度缓冲区精度.它为近距离物体交易精度,以便为远距离物体提供精确度.由于我们使用LOD方法进行渲染,因此远距离对象需要较少的精度,因为它们的三角形较少.
值得一提的是,所有列出的方法(投影网格除外)在进行物理(大多数碰撞)时非常好,因为Quadtree基础,如果你计划制作游戏,这是强制性的.
总之,只需检查所有可用的选项,然后选择一个你感觉更舒适的选项,在我看来CDLOD做得很好.不要忘记解决抖动和Z缓冲问题,最重要的是:玩得开心!
有关LOD的更多信息,请查看此链接.
有关对多维数据集进行球化的完整说明,请检查此链接.
有关解决抖动和Z缓冲区精度的更好解释,请查阅本书.
我希望你发现这篇小评论很有用.
| 归档时间: |
|
| 查看次数: |
4421 次 |
| 最近记录: |