Nov 5

地形有必要做LOD吗?

游戏开发
今天在qq上和网友聊天交流,发现大家普遍比较关注lod,特别是动态减面的lod,对于刚开始接触3D图形的同学普遍认为LOD很牛,很有必要,对于动态减面得LOD算法更是趋之若骛,其实不然,特别是针对地形(Terrain)的LOD必要性不是很大.

对于LOD的好处,我想大家都了解,就是减少提交到显卡得primitives,以减少没桢同屏渲染的三角形数量,借以提高fps,其实影响渲染fps的要素很多,其中最为关键的就是RS的切换和Draw Call的调用(D3D9中),而不是三角形的数量,而地形数据因为其特殊性,渲染地形一般不需要切换RS,Draw Call的也相对较少,并且一般地形的顶点数据都在一个Vertex Buffer内,所以渲染地形的开销很小,在我们的游戏中,渲染地形不会带来任何fps的损失(6系列显卡,低端Mx440大概5fps左右),在这种情况如果再考虑动态减面重构Vertex Buffer则得不偿失了,对于地形的LOD最多建议是静态修改Index Buffer,即提供多级Index Buffer的方法达到减面的效果,魔兽(WOW)就是这样干的,所以我个人极力不提倡使用动态减面的算法修改地形,不管是设计复杂度,还是时间开销和最后带来的好处都是得不偿失的.

我最近研究Farcry2引擎,发现他同屏渲染80-100万面每桢,其中地形占用70-90万面,可见地形的三角形数量确实庞大,但有趣的是,即使不渲染地形,桢率也就5fps(7系列显卡)左右的提高,而且Farcry2的地形是没有做LOD的,不过其模型倒是做了LOD.

最后给我我的结论,关于LOD:

模型lod(静态)有必要,动态很费,地形lod没有必要(有静态也无所谓),因为地形在现代显卡里渲染很快,基本没有rs的切换.


与其考虑地形LOD,不如考虑地形得遮挡剔除,这方面的意义远比LOD大,我们敬仰的WOW也是这样干得.


关于地形遮挡剔除的算法,可以参考我之前的博客,有详细的算法讲解,市面也有很多成熟得3rd套件可以使用.

tags:游戏  LOD  地形  Terrain  

to "地形有必要做LOD吗?"

  1. 关于物理加速的讨论 Says:

    哥们好,网上看了你的博客,看得过瘾,认识一下。对您《Ageia PhysX使用感受》非常感兴趣。我是做maya虚拟现实的,想请教几个问题。
    有一块Ageia PhysX,那么我不只是想用来玩游戏,还想用来在MAYA中发挥作用。可是网上貌似没有相关的Ageia专门发布针对maya或max或xsi的插件。
    还有一个问题,这个AGEIA PhysX SDK tool指的是我卡的驱动吗?还是插件?
    反正就是想在maya里实现实时物理加速啦~!就是这么回事。还是请您来帮我解答吧!!谢谢~!!
    我的QQ174703984 请加我,总算在茫茫网海中找到一个知音。。

  2. fo Says:

    地形不做LOD,是不是意味着四叉树LOD,ROAM,GEOMIPMAP等算法没必要

  3. hlst Says:

    ROAM算法过于古老了,不适合现在的显卡硬件加速体系,只适合古老的cpu计算...现在已经没有用纯软件加速来进行3D地形渲染了吧?

    其实siney大大所说的静态LOD,类似于楼上所说的Geomipmap,类似于贴图的mipmap原理。总之是个空间换时间的道理。

    不过对于siney的动态LOD很费,和farcry2没有使用地形LOD,我不敢苟同。

    按照farcry2的地形精度,如果没有做LOD的话,我不认为它能够在现在的顶级配置机器下流畅运行。除了视觉剔除,应当还有其他的渲染优化方法。LOD是逃不开的。

  4. levin Says:

    1. 现代的LOD计算方法是可以完全拿到显卡里面作的,以后越来越多的显卡可以具备该功能。

    2. 您所说的重构vertex不是问题,成熟的游戏,不会每贞都重新计算LOD并更新vertex,因为主角移动的速度是有限的,不会从一个地方突然切换到另外一个地方,也就意味着LOD层次不必要每次都跳变,所以一般是10秒钟时间重新计算一次LOD的vertexbuffer,这样的开销是极小的。

  5. siney Says:

    没错,现代lod可以在显卡做,意味着需要gs的显卡,但这并不是free的,而且我们需要了解影响渲染效率的瓶颈,做lod固然可以提高效率,但是不做也有很多方法可以抵消效率损失。

    当然这篇文章目前考虑的硬件没有到dx10。
    由 siney 于 2008-09-01 11:11:23 最后编辑

  6. levin Says:

    是有很多地方可以抵消损失,但是我不打算讨论这个问题,我只想说如何正确的使用lod的问题,错误使用,没准会导致效率更低,还不如不用。即便没有dx10的显卡支持,也有很多成熟的使用方式,比如每贞计算改为5-10秒/或者人物行走超过一定距离计算一次,在我的试验中,5-10秒计算并重建vertex buffer的方法的消耗,几乎看不出来因为重建导致的消耗,比没有lod的整个场景的静态vertex buffer效率提高了若干倍。

    siney 于 2008-09-05 13:10:17 回复
    就不要说重建vb,即使你用静态的lod,也不见得会提高渲染效率,关键在于渲染效率在现代显卡上,根本就不取决于vertice的多少,为了你一次渲染1w个面,和1k个面根本没有差别,效率的损失是rs的切换,fx等。

    对你提出比没有lod的整个场景的静态vertex buffer效率提高了若干倍,这个说法,我表示怀疑,不知道你的场景是不是就是一个简单的多边形?

  7. eio Says:

    动态LOD肯定是没戏……

    如果贴图重复、远裁平面近的情况下 不要静态LOD也可以接受

    但如果贴图不重复、或者地形比较精细的情况下(比如GIS中) 分tile做clipmap是必须的
    因为在稍大的地形中 贴图未压缩数据十几G、三角形几千万是很正常的事情 没有LOD……

  8. eio Says:

    合适的优化之后 动态LOD也可以勉强使用
    这种方法基本只适用在一种情况:地形可由用户大范围高频度的任意改变的场景 比如百战天虫之类的玩意……

  9. effulgent Says:

    你要做视距16km的地形,就不会觉得LOD无用了,现在当然首选静态LOD,一方面是减少TRI_NUM,一方面减少DP

Leave a Reply