存在不少东西没有看懂,后续需要再整理一遍。
大地之神与天空之神
课程定位: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原则:
- 距离相关:近处密,远处疏
- 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)
应用场景:
- 拖拉机在稻田压出车辙
- 《战神》中的可变形雪地
- 炮弹爆炸留下的弹坑
实现逻辑:
- 使用GPU Tessellation实时生成几何
- 在Runtime维护一张Deformation Texture(变形贴图)
- 在Vertex Shader中叠加变形偏移量
- 物理同步:需同步更新碰撞体(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(虚拟纹理)
核心思想:只加载视锥内可见区域的纹理,类似操作系统的虚拟内存管理。
工作流程:
- 将大地形划分为多级Tile(瓦片),组成Mipmaps金字塔
- Physics Texture(物理纹理/缓存):仅存储当前可见的Tile
- Feedback/Indirection:通过查找表(Page Table)将UV映射到物理纹理位置
- 异步加载:通过"小徒弟"(线程/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)
趋势:从手工编辑转向基于规则的程序化生成。
能力:
- 基于坡度、高度、材质类型自动生成植被(阔叶林→针叶林过渡)
- 模拟流水腐蚀生成山脊、冲沟
- 自动生成道路网络
要求:引擎开发者需具备博物学知识,理解地质、生态规律。
总结:成为"大地之神"的技术路径
- 基础:掌握Height Field与LOD原理
- 几何:实现Quadtree + GPU Tessellation,处理T Junction
- 材质:Texture Splatting + Virtual Texture
- 动态:GPU Driven Deformable Terrain
- 精度:Camera Relative Rendering解决大空间问题
- 生态:整合SpeedTree、Decorator、Road、Decal系统
- 未来:探索Volumetric Terrain与Marching Cubes