2022-10-23-GAMES104现代游戏引擎-Lecture22-GPU Driven Geometry Pipeline - Nanite
Lecture22 GPU Driven Geometry Pipeline - Nanite Research Background 传统渲染管线 CPU发起Draw Call,GPU准备State、进入漫长的Pipeline CPU、GPU不同步 存在大量的算力浪费 现代游戏Draw Call越来越复杂,已经成为现代渲染管线瓶颈 “曙光”: Compute Shader:不再需要在CPU、GPU之间来回传递数据,直接在GPU中执行通用计算 Draw-Indirect Graphics API:一次Draw Call绘制多个Mesh GPU Driven Render Pipeline 将场景完整load到显存中,完全由GPU处理:DrawPrimitive -> DrawScene @《刺客信条:大革命》 Mesh Cluster Rendering 将Mesh分成同样三角形数量的Cluster,便于交给GPU做裁剪等计算 不可见的Cluster不渲染;Culling流程: 尽可能裁剪掉不可见的三角形 将可见的三角形组成同一个Buffer GPU Driven Pipeline CPU端: 根据材质不同组合Instance 根据相机距离LoD 打包交给GPU做后续处理 GPU Instance Culling Instance Culling 将(64个)Cluster组成一个Chunk,再次Culling,以加速 GPU Cluster Culling Chunk -> Cluster -> Triangle 一步步裁剪,将视锥外、背面的全部裁剪 Index Buffer Compaction 将可见三角形的依次写入备用Index Buffer 三角形顶点顺序不统一时,可能导致前后帧三角形顶点顺序不一致,由于Z-Buffer精度有限,导致Z-Fighting问题 => 硬件Multi-Indirect Draw Call或可解决此问题 对高精度的Mesh效率非常高 Codec Triangle Visibility in Cube : Backface Culling 每个Cluster存储每个三角形对两个方向的可见性 利用这一数据快速做Backface Culling Occlusion Culling for Camera and Shadow 利用前一帧Z-Buffer的方法: 取当前帧的一部分(如300个)近处大Mesh作为可能的Occluder渲染Z-Buffer 将上一帧的深度重投影到当前帧,用于补充当前帧Z-Buffer空缺处 保守估计Culling Instance -> Chunk -> Cluster -> Triangle 问题:高速移动物体存在一定Artifact Two-Phase Occlusion Culling 快速绘制通过上一帧的Z-Buffer Test的Instance的当前帧Z-Buffer 再利用当前帧不完整的Z-Buffer,测试剩余所有Instance,选出可见者 更加准确 Fast Occlusion for Shadow Shadow中生成深度时对几何细节量敏感 对每个Cascade,将上一帧相机深度重投影至当前帧Shadow深度,并混合上一帧Shadow深度 只有摄影机可见区域内需要生成阴影:只对相机可见的Instance生成Shadow的Z-Buffer Visibility Buffer Forward Rendering:所有互相遮挡、透明的物体需要做重复计算 Deferred Shading:用G-Buffer存储可见Pixel的各种数据,只对G-Buffer做光照计算 G-Buffer的存储、IO开销大 复杂场景下,因为难以判断可见性,在生成G-Buffer时产生Over draw,多次绘制同一像素时开销大 Visibility Buffer: 第一遍渲染时,只在Buffer中存储: (Alpha masked bit, DrawID, PrimitiveID, MaterialID, …) 根据各种ID读取对应贴图,再做重心坐标插值着色 几乎没有Over Draw Cache Miss率低 Pipeline Visibility Buffer + Deferred Shading 一般来说,草丛等复杂细节情况可直接用Visibility Buffer渲染,主角等主要内容Gather到G-Buffer再渲染 注意点:MIPMAP采样时的插值平滑问题 Virtual Geometry - Nanite Overview Virtual Texture Idea:将场景中所有贴图加载到内存中开销非常大,能否只加载可见部分且LoD后精度的贴图 所有材质加载到同一张“大贴图”中,并对整个贴图做MIPMAP 预烘焙这张“大贴图”,并做MIPMAP 根据View区域动态加载所需的部分 Idea of Nanite Virtual Geometry like Virtual Texture 挑战:几何数据是非Uniform的、互相之间可能没有关联性、Mesh数据难以Filter(SDF、Voxel、Point Cloud可以Filter) Voxel ?...