GAMES104现代游戏引擎 - 游戏中地形大气和云的渲染(上)

文章字数:3983

存在不少东西没有看懂,后续需要再整理一遍。

大地之神与天空之神

课程定位:GAMES104《现代游戏引擎:从入门到实践》第6讲,主题为"Mother Nature(自然之母)“的渲染——如何用0和1表达壮美的自然界。

“大地之神”(God of the Earth)与"天空之神”(God of the Sky):游戏引擎团队中,负责地形系统的工程师被称为"大地之神",负责天空、光照、云层的被称为"天空之神"。这些称号是团队自发形成的,体现了对自然渲染技术的热爱。

渲染自然之美:从西班牙洞穴壁画到毕加索,人类对自然的表达本能延续至今。游戏引擎开发者的使命是用数学公式将山川、河流、天空转化为虚拟世界。

地形渲染基础(Terrain Rendering Basics)

核心概念:Height Field(高度场/高程图)

定义:地形在游戏引擎中称为 Terrain,源自古英语中"地球之母"的含义。

Height Field 是最基础的地形表达方式:

  • 使用二维灰度图表示地形高低(类似等高线地形图)
  • 数学本质:$y = f(x,z)$,单一数值函数
  • 早在计算机游戏出现前,测绘领域已使用等高线(Counter)表达地形

几何生成

  • 生成均匀网格(如每1米一个顶点)
  • 根据Height Field对顶点进行Y轴位移
  • 早期方法简单,但开放世界(Open World)中数据量爆炸(1km×1km需100万个顶点)

分形(Fractal)与自然规律

自然界的地形(山脉、海岸线、腐蚀痕迹)符合分形原则:无限自相似的形状。这一数学规律是程序化生成地形的基础。

地形LOD(Level of Detail)技术

核心矛盾:近处需要细节,远处需要效率。

LOD原则

  1. 距离相关:近处密,远处疏
  2. FOV(Field of View)相关:视角越窄(如开镜),三角形越细密;视角越宽,越稀疏
    • 原理:相同屏幕像素下,FOV越小,单个物体占据像素越多,需要更高几何精度
    • 应用:3倍镜、8倍镜的实现就是缩小FOV

网格细分算法

Binary Triangle Tree(基于三角形的二分细分)

  • 方法:永远对等腰直角三角形的最长边(斜边)中点切分,生成两个新的等腰直角三角形
  • 结构:二叉树结构
  • 问题T Junction(T型连接/裂缝)
    • 当相邻三角形细分层级不同时,共享边上出现"一边有顶点,一边无顶点"的情况
    • 结果:地形出现裂缝(看到天空背景的白边)
    • 解决:强制细化较粗的一边,直到与邻居同级

Quadtree(四叉树)- 现代游戏主流方案

  • 思想:将地形切成"豆腐块",符合人的直觉和计算机存储规范(纹理、高度图都是方块状)
  • 层级
    • Block:如512m×512m磁盘数据块(存储高度图、贴图、植被、建筑信息)
    • Patch:继续细分为64m×64m等
    • 细分到视觉极限后停止合并

T Junction解决方案:Stitching(缝合)

  • 不修改几何拓扑,而是将多出的顶点"吸附"(Stitch)到邻居边上
  • 形成退化三角形(Degenerate Triangle)(面积为0的三角形)
  • 优点:不改变网格结构,代码实现比Binary Triangle Tree简单

地形GPU Driven Tessellation

传统管线(DX11)

  • Hull Shader:生成细分用的Patch(控制点)
  • Tessellator:硬件固定单元,按设定次数细分边
  • Domain Shader:在细分后的顶点上采样高度图,位移顶点
  • Geometry Shader:后处理,传递顶点数据到下一阶段

现代方案:Mesh Shader(DX12+)

  • 革命性变化:合并Hull、Domain、Geometry Shader,一次性生成Meshlet(小片几何体)
  • 优势
    • 程序员完全控制细分算法
    • 更灵活的几何生成能力
    • 为动态地形(Deformable Terrain)提供基础

动态地形(Dynamic/Deformable Terrain)

应用场景

  • 拖拉机在稻田压出车辙
  • 《战神》中的可变形雪地
  • 炮弹爆炸留下的弹坑

实现逻辑

  1. 使用GPU Tessellation实时生成几何
  2. 在Runtime维护一张Deformation Texture(变形贴图)
  3. 在Vertex Shader中叠加变形偏移量
  4. 物理同步:需同步更新碰撞体(Collision Mesh),否则出现"人走在虚空"的Bug

复杂地形特征:超越Height Field

Height Field的局限

  • 无法表达垂直悬崖(Overhang)
  • 无法表达洞穴(Cave)、隧道

传统Hack方案

  • 挖洞标记:在Vertex Shader中,将需要挖洞区域的顶点输出为NaN(无效数),GPU会自动剔除相关三角形
  • 接缝处放置物体:在悬崖边缘人工放置岩石模型遮挡接缝

Volumetric Terrain(体素化地形)+ Marching Cubes

概念:在三维空间体素(Voxel)中存储密度值(Weight),而非单一高度。

Marching Cubes算法

  • 根据8个体素点的密度值,查找预先定义的15种(或更多)剖分方式
  • 生成水密的三角网格(Watertight Mesh)
  • 应用:CT扫描可视化、数字人、流体模拟

现状与展望

  • 目前主要用于《Minecraft》等体素游戏
  • 挑战:LOD过渡、数据管理复杂
  • 潜力:实现真正的全动态地形(任意挖洞、挖掘)

地形材质系统

Texture Splatting(纹理 splatting/混合)

基础方案

  • Splat Map(混合贴图):每个通道代表一种材质的权重
  • 材质属性:Base Color、Normal、Roughness、Metallic、Height

Height Based Blending(基于高度的混合)

  • 问题:Alpha混合导致沙子"浮"在石头表面,不真实
  • 解决:结合Height Map比较高度,高者保留,低者消退
  • 效果:沙子填充石缝,草从石缝生长,而非覆盖石头

优化抖动

  • 加入Bias(偏移量,如0.2)Smoothstep,避免材质切换时的锐利分界和远处视角的闪烁(Aliasing)

Multi-Material Management(多材质管理):Texture Array

  • 概念:将多层无关的2D纹理堆叠,用Index访问(而非3D Texture的Trilinear插值)
  • 优势:支持几十种材质混合,层间无插值开销
  • 数据组织:Splat Map同时存储材质Index和混合权重

凹凸细节增强

  • Parallax Mapping(视差贴图)
    • 通过光线步进(Raymarching)模拟视差
    • 产生立体感的凹凸效果,但几何边界仍平整
  • Displacement Mapping(置换贴图)
    • 结合Tessellation真实位移顶点
    • 成本较高,未来趋势

Virtual Texture(虚拟纹理)

核心思想:只加载视锥内可见区域的纹理,类似操作系统的虚拟内存管理。

工作流程

  1. 将大地形划分为多级Tile(瓦片),组成Mipmaps金字塔
  2. Physics Texture(物理纹理/缓存):仅存储当前可见的Tile
  3. Feedback/Indirection:通过查找表(Page Table)将UV映射到物理纹理位置
  4. 异步加载:通过"小徒弟"(线程/IO系统)从磁盘/内存按需加载Tile,卸载不可见Tile

优势

  • 内存:显存占用有理论上限(几何级数收敛)
  • 性能:材质混合在加载时预计算(Baking),Runtime直接采样单张纹理,极大降低Overdraw和Texture Sampling开销

硬件加速

  • DirectStorage:硬盘→显存,保持压缩状态传输,在GPU解压
  • DMA(Direct Memory Access):PS5技术,数据直接从SSD到显存,绕过CPU和内存总线

浮点精度问题(Floating Point Precision)

问题:32位Float在表达大范围世界(如地球到月球,或大型开放世界)时,小数部分精度不足(精度随数值增大而降低),导致远处物体抖动(Jittering)。

现象:在2-3公里外,数值达数万时,小数精度可能超过1厘米,导致贴花(Decal)与墙面打架、物体闪烁。

解决方案:Camera Relative Rendering(相机相对渲染)

  • 将相机坐标设为原点(0,0,0)
  • 所有世界坐标减去相机坐标,转换为相对坐标
  • 保留高精度的小数部分,消除抖动

其他方案

  • 使用Double(64位浮点):数据量和带宽成本过高
  • Sublevel(子关卡)相对坐标:UE5等大型引擎采用,每个关卡重置坐标系

环境要素系统

树木渲染(Foliage)

  • SpeedTree:行业标准的植被中间件
  • LOD策略
    • 近处:真实Mesh
    • 中距离:插片(Card)组合
    • 远处:Billboard(公告板)

Decorator(装饰物)

  • 定义:小草、碎石、小灌木等环境细节
  • 技术:Simple Mesh、Billboard集群渲染

道路系统(Road System)

  • Spline(样条曲线):艺术家通过控制点拖拽生成道路
  • Erosion(腐蚀/切割):道路生成后,需对Height Field进行切割和平整处理,使山地适合作道路

Decal(贴花)

  • 定义:投射到表面的细节纹理(如弹孔、污渍、路面标线)
  • 应用:与Virtual Texture结合,烘焙到地形贴图中

程序化生成(Procedural Generation)

趋势:从手工编辑转向基于规则的程序化生成。

能力

  • 基于坡度、高度、材质类型自动生成植被(阔叶林→针叶林过渡)
  • 模拟流水腐蚀生成山脊、冲沟
  • 自动生成道路网络

要求:引擎开发者需具备博物学知识,理解地质、生态规律。

总结:成为"大地之神"的技术路径

  1. 基础:掌握Height Field与LOD原理
  2. 几何:实现Quadtree + GPU Tessellation,处理T Junction
  3. 材质:Texture Splatting + Virtual Texture
  4. 动态:GPU Driven Deformable Terrain
  5. 精度:Camera Relative Rendering解决大空间问题
  6. 生态:整合SpeedTree、Decorator、Road、Decal系统
  7. 未来:探索Volumetric Terrain与Marching Cubes

参考信息

加载中...