link:
http://publications.dice.se/attachments/GDC12_Terrain_in_Battlefield3.pptx
<Terrain in Battlefield 3: A modern, complete and scalable system>
两个我比较喜欢的图:
说是地形系统,其实说环境系统更合适一些,这里提到地形包括这样一些:
- 基于高度图的地形,可破坏
- 多层混合的材质
- 路面等各种decal
- decoration:植被,小石头等
- 水(河,湖。。。)
地形涉及到的资源:
- 高度图
- 混合材质用的mask贴图
- 一个color map
- 有物理信息的材质--可模拟声音等
- 用于记录破坏信息的depth mask
- 由于记录间接反射光的albedo map
Scalability
dice使用四叉树做lod的管理,这里lod是一个比较广泛的概念,包括:
- terrain本身的资源:高度图,mask等
- decoration
- decal
- water
这些的lod管理统一在一个quad tree系统中来做,进而控制streaming in/out,所以尽管地形是非常大的,但是实际在系统中的资源是比较恒定的。
这个也是主要针对dice这种地形信息包含的非常多而且复杂(lod层级多,甚至没有lod层级的概念,都是smooth的:比如decoration)的情况,一般项目可能只有2级,那么也不用这么复杂了,也是具体问题具体分析了。
编辑器
dice这里做的比较好的是对于“导入”支持的比较充分,可以分块的进行信息的导入,这个对于现代地形系统很关键。
因为随着技术的进步,刷刷高度图远不能满足需求,需要用更专业的软件来处理,比如dice提到的world machine和geo control,这些达到的程度对于engine开发者来说要做到就太难了,所以导入的支持是很重要的。
效率
ps3上给出的数据:
- gbuffer:单纯地形是2.5--3, 加上各种细节是2.5--7
- decoration:1--4ms
- virtual texture composite:0.2--0.5
virtual texture
这个在本博客里面也提了n遍了,就是为了解决多层混合(splatting)的效率问题。
dice这上面的一些细节:
- 1米32个sample
- 使用使用atlas来进行贴图合并,每一个子块是256x256的tile,为了避免filter的问题,还有2个pixel的border
- 用于virtual texture的贴图大小是4kx2k
- virtual texture是2个dxt5,normal分别放在压缩损失少的alpha&g通道里
然后使用了indirection texture来存储指向atlas 贴图那一个部分的信息,格式rgba8,分别放了:
- index x&y
- scale:如果一个tile里面包含了多个atlas的贴图tile,需要scale来处理
- lod的fade factor
这里的indirection texture是做了clipmap,因为不做任何atlas的处理的话,一个真正的virtual texture会达到1Mx1M=1T的texel量,然后256一个tile,indirection texture也会到4kx4k,这个也太大了。
所以使用了clipmap处理indirection texture,size是64x64,个数是6,每一个还有mip chain.
具体用那一个clipmap的level是cpu端算出来的,而且里面贴图需要按照world space position来分布,这个对于地形完全没问题。
tile是在gpu上混合并且压缩的(ps3上spu参与压缩),这里两大额外消耗:
- 用于混合(compositing)的额外的render target的内存消耗
- 混合的时间消耗
Streaming:
首先dice列了一些地形上一个tile的数据:
- height field:133x133x2byte
- mask: 66x66x1byte
- color map, 264x264x0.5byte
fixed size tile pool:
- height map:2kx2k
- mask:2kx1k
- color:2kx2k
disk seek:
- 把资源根据地形的位置分布放到比较近的地方,可以节省%20--%50的seek时间
全局优先级(global priority):
使用优先级对各种资源进行管理,按照顺序来进行streaming。
优先级的制定也是比较复杂,来源颇多:
pc和360上是vertex texture sampling
ps3上貌似是render to vertex buffer
小结:
几个地方比较喜欢:
- 把地形的概念进一步扩展,进而做一个更统一的管理(渲染到streaming),设计上也更紧凑简洁
- virtual texture很棒