现在的位置: 首页 > 综合 > 正文

[gdc2012]战地3的地形系统

2013年02月07日 ⁄ 综合 ⁄ 共 1985字 ⁄ 字号 评论关闭

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。
优先级的制定也是比较复杂,来源颇多:
  • culling信息
  • speed
  • update
mesh
pc和360上是vertex texture sampling
ps3上貌似是render to vertex buffer

小结:
几个地方比较喜欢:
  • 把地形的概念进一步扩展,进而做一个更统一的管理(渲染到streaming),设计上也更紧凑简洁
  • virtual texture很棒


抱歉!评论已关闭.