Terrain in Battlefield3 笔记
- Overview概述
- Scalability - hierarchies, payloads and limitations
- 2.1 Scalability 可扩展性
- 2.2 Quadtree node payload 四叉树的节点分析
- 2.3 Nodes with and without payload 动态数据块
- 2.4 LOD payload 地形数据块的LOD
- 2.5 View-dependent payload usage 基于相机视角的数据块使用
- 2.6 Motivation for LOD payloads 使用LOD数据的动机
- 2.7 Generation of raster LOD payload 光栅LOD数据的生成
- 2.8 Terrain decoration payloads 地表装饰数据
- 2.9 Terrain decoration LOD payloads 地表装饰数据的LOD信息
- Workflows - real time in-game editing 实时编辑
- CPU and GPU performance 性能
- Procedural virtual texturing - powerful GPU optimization 虚拟贴图技术
- Data streaming - minimizing memory footprint
Overview概述
战地3是用寒霜引擎开发的第一人称射击游戏,本篇主要针对GDC关于Terrain方面的PPT内容做一些笔记。
1.1 地形系统特征
战地3的大地图有如下几个特征:
- Heightfield-based 基于高度图的生成
- Mesh procedurally generated at run time 程序化实时生成地表网格
- Surface rendering with procedural shader splatting
- Arbitrary shaders splatted according to painted masks 地表渲染使用多层混合材质
- Spline and quad decals 基于Spline生成路面、电线杆等
- Terrain decoration
- Automatic distribution of meshes (trees, rocks, grass) according to mask 利用mask图片自动生成树木、草、石头等分布
- Billboards supported
- Important as the terrain surface itself
- Destruction / dynamic terrain 可破坏的动态地表,比如烧掉植被、把地面炸出坑等
- Destruction depth map
- Controls crater depth around static models
- Physics material map 物理信息,控制地表特效、声音、破坏的宽度和深度等
- Controls surface effects, audio, crater depth and width
- Destruction depth map
- Rivers / lakes 河流和湖泊
- Implemented as free-floating decals
- Water depth in pixel shader
1.2 地形系统用到的资源
- Heightfield 高度场
- Shader splatting masks 混合材质用的mask贴图
- Colormap, used as an overlay on top of shader splatting
- Physics materials 材质物理信息,控制地面的特效和声音等
- Destruction depth mask 记录破坏信息
- Albedo map for bounce light 贴图
- Additional mask channels 其他mask图片
Scalability - hierarchies, payloads and limitations
2.1 Scalability 可扩展性
对于可扩展性的定义主要包括如下几个部分:
- 能够支持任意视距(0.06米到30000米)
- 能够支持任意程度的细节(0.0001米尺寸的细节或者更小)
- 能够支持任意的相机速度(跑车和喷气式飞机)
寒霜引擎利用分级的方式实现地表的可扩展性,不仅仅用在地表,在之前的飞行模拟器中就已经实现了类似的技术。
战地3在这里使用四叉树来存储地表的空间特征。
2.2 Quadtree node payload 四叉树的节点分析
地形四叉树中的每一个节点都是一个数据块,主要包括以下几个部分的信息:
- 地表用到的贴图
- 地表装饰物的信息,包括石头、草、树等需要instancing的信息
- 道路等需要投影叠加上去的物件信息
虽然每个节点都包含了数据块的信息,但是游戏实际运行时只会加载其中的一小部分。
2.3 Nodes with and without payload 动态数据块
每个节点的数据块是动态的,在游戏运行的每一帧都有可能加载、生成或者释放,因此只会有一部分的地形节点包含完整的数据块信息。
引擎对数据块使用了优先级管理的机制。
2.4 LOD payload 地形数据块的LOD
树的非叶子节点也会包含一部分的地形数据信息,比叶子结点的信息要少一点,称为地形数据块的LOD信息。叶子结点使用完整的数据信息,越靠近根节点则使用越简化的数据信息。
2.5 View-dependent payload usage 基于相机视角的数据块使用
当相机位于某一个叶子节点的位置时,加载的节点如下图所示,绿色的节点会加载的数据块。
当相机移动到另外一个位置的时候,加载信息的节点也会相应的变化,如下图所示。
2.6 Motivation for LOD payloads 使用LOD数据的动机
当使用了LOD机制,地形加载的数据量就与地形整体的大小独立开了,不管地形扩到多大,加载的数据量是可控的,因此具有了良好的可扩展性。
使用LOD机制,场景只会加载距离角色最近的一部分区块的内容。
如果不使用LOD机制,把一大堆区块加载进来,则随着场景越来越大,要加载的数据也越来越多,扩展性非常差。
2.7 Generation of raster LOD payload 光栅LOD数据的生成
地表的光栅信息主要在叶子节点包含完整的数据,然后会自动生成LOD的信息。
由于地表是分块的,因此在区块边界的渲染会做特殊处理,从而避免接缝问题,并且会随着相机的移动持续进行计算。
使用递归的深度优先搜索,如下图所示,红色的部分是高精度的区块,蓝色的部分是低精度的邻居区块,绿色的部分是自动生成的处理接缝的区域。
2.8 Terrain decoration payloads 地表装饰数据
地表装饰主要包含了一系列需要做instance的物件(比如草、树、石头等)的位置、缩放和旋转信息。
这些信息会根据以下几条规则进行实时的生成。
- 物件散步规则
- 不同种类物件区域划分的mask,控制密度和位置等,允许运行时用shader实时修改
- 地面的高度场信息
2.9 Terrain decoration LOD payloads 地表装饰数据的LOD信息
这些装饰物的LOD规则也具有比较好的可扩展性。
- 接近叶子节点的数据能够在近距离显示高密度的装饰
- 接近根部节点的数据能够在远提供更远的视野范围
在近距离的时候显示叶子更多更密集的植被,随着距离的拉远,密度逐渐降低。
Workflows - real time in-game editing 实时编辑
3.1 Real time editing in FrostEd 实时地表编辑
使用寒霜引擎的编辑器FrostEd来编辑地表。
在Game View可以看到游戏运行时的效果。
Terrain编辑器可以对如下处理进行实时的反馈:
- 高度场雕刻
- Mask遮罩和颜色的绘制
- 贴地组件编辑
- 地表装饰编辑
3.2 External tools 外部工具
引擎内部的地表编辑功能不能完全满足需要,因此会将地表的数据分块保存为metadata和raw file,导入WorldMachine、GeoControl等地形软件里进行编辑,然后再导入回到游戏引擎里面。
CPU and GPU performance 性能
因为是在PS3上运行,放到现在没有什么参考性,所以就把原文放这里了
4.1 Efficient on CPU
All work done in jobs, most on SPU and many wide
- Early unoptimized versions consumed 10ms+ PPU time
- BF3 final measurements (PS3)
- 1-2ms SPU (peaks at ~8ms when lots of terrain decoration is happening)
- <1ms PPU
- BF3 final measurements (PS3)
4.2 Efficient on GPU
Pre-baked shader permutations to avoid multi-pass
Procedural virtual texturing exploit frame-to-frame coherency
Typical figures (PS3)
- Full screen GBuffer laydown (w/o detail overlay and terrain decoration): 2.5-3ms
- Full screen GBuffer laydown (w/ detail overlay): 2.5-7ms
- Terrain decoration: 1-4ms
- Virtual texture tile compositing: 0.2-0.5ms
Procedural virtual texturing - powerful GPU optimization 虚拟贴图技术
5.1 GPU optimization: Procedural virtual texturing 利用虚拟贴图优化GPU
利用贴图混合的方式可以制作出丰富的地表,但是会大大增加渲染的压力,并且贴图混合不能支持多线程计算。
利用虚拟贴图,则可以同时提高性能和可扩展性,能够在多个pass里进行渲染。
PS3全屏渲染在2.5-3ms。
5.2 Virtual texture key values 虚拟贴图的一些参数
1米32个sampler
虚拟贴图的atlas中,一块贴图是256x256大小的尺寸,预留2个像素的边界
虚拟贴图的Atlas最大尺寸是4K x 2K大小
用2张DXT5格式的贴图,一共7个通道存储可漫反射、法线、高光和可破坏信息
R | G | B | A | R | G | B | A |
---|---|---|---|---|---|---|---|
Diffuse R | Diffuse G | Diffuse B | Normal X | Smoothness / Destruction | Normal Y | Specular | Normal Z |
虚拟贴图可以非常大,甚至有可能达到1M x 1M (=1T Pixel)
- 通常情况下虚拟贴图是64k x 64k
5.3 Indirection texture format
Indirection texture用来记录需要使用虚拟贴图哪一个Atlas,格式是RGBA8,每个通道的信息如下:
R | G | B | A |
---|---|---|---|
Index X | Index Y | Scale | CLOD Fade |
Scale是用来对分辨率进行缩放用的,处理一个tile包含了多采样的情况。
CLOD Fade参数是用来让地表的纹理平滑过渡到另一个tile上(fade-to tile)。
之前的LOD(fade-from tile)已经在atlas里面了,会使用indirection mips获取。
CLOD参数每一帧都会更新。
5.4 The “Teratexture”
虚拟贴图会到1M x 1M的尺寸,indirection texture到4K x 4K的分辨率,资源消耗太大。
所以会对indirection texture使用clipmap处理,用6层64x64的clipmap代替4K的indirection texture。
5.5 Tile compositing
Tile在GPU合成,在GPU或者SPU里压缩,有如下几方面的好处:
- 磁盘占用小,能够放大数据量
- 延迟低,下一帧就可以使用
- 可以动态更新,支持破坏和实时编辑
- 高效的工作流程,美术的制作比较方便
Data streaming - minimizing memory footprint
Battlefield 3 和 NFS: The Run levels都使用了流式数据处理。
6.1 Streaming basics
流式加载的单位是一个区块,其中的数据尺寸为:
- Heightfield: 133x133x2 bytes
- Mask: 66x66x1 bytes,0-50张
- Color: 264x264x0.5 bytes
Atlas最大可以支持的数据尺寸为:
- Heightfield: 2048x2048
- Mask: 2048x1024
- Color: 2048x2048
6.2 Streaming modes 流式加载的模型
Tile-by-tile (aka free) streaming
- 玩家走到哪加载到哪的加载
Tile bundle (aka push-based) streaming
- 把一整个区块打包加载
- 和地表分辨率有较大关联
Hybrid streaming
- 混合式加载,最常用的方法
- 出生点及其附近采用打包加载的方式
- 角色跑起来之后剩余的部分使用自由加载的方案
6.3 Resident set size: Powerful blurriness 利用模糊方法降低常驻数据占用
流式加载不能降低内存占用,所以常驻数据还是有必要的。但是常驻数据的尺寸可能会很大,战地3在PS3上可能达到70+Mb的数据量。因此使用模糊的方式降低分辨率可以节省大约70%的内存空间。
模糊实际上就是现在游戏中常用的mipmap技术,近距离使用分辨率高的贴图,远距离使用分辨率低的贴图。
模糊并没有损失某些类型的数据,只是把数据切换到了下一级,精度有所降低。