[GDC2012] Terrain in Battlefield3 笔记

battlefield

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
  • 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在这里使用四叉树来存储地表的空间特征。

quadtree 在这里插入图片描述

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

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个通道存储可漫反射、法线、高光和可破坏信息

RGBARGBA
Diffuse RDiffuse GDiffuse BNormal XSmoothness / DestructionNormal YSpecularNormal Z

虚拟贴图可以非常大,甚至有可能达到1M x 1M (=1T Pixel)

  • 通常情况下虚拟贴图是64k x 64k

5.3 Indirection texture format

Indirection texture用来记录需要使用虚拟贴图哪一个Atlas,格式是RGBA8,每个通道的信息如下:

RGBA
Index XIndex YScaleCLOD 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技术,近距离使用分辨率高的贴图,远距离使用分辨率低的贴图。

模糊并没有损失某些类型的数据,只是把数据切换到了下一级,精度有所降低。

6.4 Reducing disc seeks 磁盘读写性能优化

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值