今天在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套件可以使用.