概念页
深度缓冲
Z-Buffer
深度缓冲是几乎所有图形硬件用来解决可见性的算法:为每个像素存一个当前最近图元的深度值,新片元更近才写入颜色和深度。它简单、和图元数量成线性关系、允许大多数图元以任意顺序绘制,但不能直接处理半透明。
原理
- 深度缓冲和颜色缓冲大小、形状相同,每个像素存储当前最近图元的 z 值。
- 渲染图元到某个像素时,计算该处的 z 值并与缓冲中的值比较:
- 更小(更近):更新这个像素的颜色和 z 值;
- 更大(更远):颜色缓冲和深度缓冲都不变。
- 这一步在像素处理的合并阶段完成。
优点
- 算法简单,复杂度为 O(n),n 是要渲染的图元数量。
- 只要能逐像素算出 z 值的图元都能用。
- 大多数图元可以按任意顺序绘制,这是它流行的另一个原因。
局限:半透明
每个像素只存一个深度,所以无法正确处理部分透明的图元。常见做法:
- 先画完所有不透明物体,再把半透明物体从后往前排序绘制;
- 或者使用顺序无关的透明算法 (OIT)(RTR4 第 5.5 节)。
RTR4 称透明是基础深度缓冲最主要的弱点之一。
和 discard 的配合
早期 API 用 alpha 测试按 alpha 值丢弃像素;现在可以在像素着色器里用 discard,按任意条件丢弃片元,保证完全透明的片元不会写入深度缓冲(RTR4 第 6.6 节),常用于树叶、栅栏这类镂空贴图。
在游戏开发中的意义
- 半透明排序是引擎里的常见问题来源,比如粒子、玻璃、水面互相穿插时的排序错误。
- 不透明物体虽然顺序无关,但按从前往后排序能让 early-z 剔除更多被挡住的片元,减少像素着色开销(见 合并阶段与帧缓冲 的 Early-Z 一节)。
GEA 的视角:深度缓冲光栅化与深度状态的用法(卷 II 11.3.10.5、11.3.11、11.5.2)
算法
- 准备一张与帧缓冲同尺寸、存深度的位图(帧缓冲的一个图像平面),初始化为"无穷远";按任意顺序光栅化三角形,对每个片元插值出深度,比缓冲中的值小就同时覆盖颜色和深度,否则丢弃(卷 II 11.3.10.5)。
- 它是对画家算法的增量式修正:每画一个三角形就更新一次"哪些片元离相机最近",画完后颜色缓冲里只剩每个像素直接可见的片元颜色。
测试与写入分开控制的用例
深度测试和深度写入可以独立开关(卷 II 11.3.11)。GEA 的例子是第一人称射击游戏里贴墙时枪模穿进墙里:
- 先画除枪以外的所有东西,深度测试和写入都打开;
- 再画枪,关闭深度测试,于是即使墙比枪的某些部分更近,枪的所有片元也会画出来。
脚注补充:这样做时枪自己的三角形要先从后往前排序;另一种做法是第一遍画完后清空深度缓冲再画枪(两遍都开测试和写入);第三种是把枪画到离屏纹理,再关闭深度测试画一个贴这张纹理的四边形。
z 预通道与 early-z
- 按材质排序能减少状态切换,但会增加过度绘制;不透明像素的过度绘制纯属浪费。early-z 要在像素着色器之前丢掉被遮挡片元,最好从前往后画(卷 II 11.5.2)。
- z 预通道调和这对矛盾:第一遍只写深度,GPU 有关闭像素着色器、只更新 z 的"双倍速"模式,可以按从前往后的顺序画;第二遍按材质重新排序,画完整颜色,此时已几乎没有过度绘制(卷 II 11.5.2.1)。排序与状态切换的取舍见 绘制调用与状态切换优化。
- 另一种思路是一种"扩展的深度缓冲"——可见性缓冲,见 延迟纹理与可见性缓冲。
- 深度和模板的存储格式见 合并阶段与帧缓冲 中的 GEA 部分。
出处
- realtime_rendering_4ed.pdf 第 2 章 The Graphics Rendering Pipeline
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.3.10.5、11.3.11、11.5.2 节
相关页面
图形学渲染管线Rendering Pipeline渲染管线是实时图形的核心:给定虚拟相机、三维物体、光源等,把场景转换成一张二维图像。RTR4 把它粗分为四个功能阶段:应用、几何处理、光栅化、像素处理,各阶段并行执行,整体速度由最慢的阶段决定。图形学合并阶段与帧缓冲Merging & Framebuffer合并阶段把像素着色算出的片元颜色和缓冲区里已有的颜色结合起来,同时负责深度测试、模板测试和混合。它通常不可编程但高度可配置,也叫 ROP(光栅操作或渲染输出单元)。帧缓冲是系统中所有缓冲区的总称。图形学透明渲染与 Alpha 混合Transparency & Alpha Blending本页讲最简单的"视角相关"透明:半透明物体只衰减其后方物体的颜色。z-buffer 每像素只存一个表面,所以透明物体通常要从后往前用 over 运算符混合;顺序无关透明 (OIT) 方法用多遍渲染、逐像素链表或近似公式避免排序,各有内存、性能或准确性代价。预乘 alpha 让过滤、混合和合成更正确高效。游戏数学投影矩阵Projection Matrix投影矩阵把视景体变换到规范视体(OpenGL 为 [-1,1]^3,DirectX 的 z 为 [0,1]),在那里裁剪更高效。正交投影保持平行线平行、物体大小与距离无关;透视投影让远处变小,产生的深度与观察深度成反比,近平面位置和"反向 z"决定深度精度。图形学阴影贴图Shadow Mapping阴影贴图 (Williams, 1978) 先从光源位置渲染深度,再从相机渲染时把每个点到光源的距离与贴图中存的深度比较:更远就在阴影中。它开销可预测(生成约与图元数成线性、查询为常数时间),非常适合 GPU,是任意表面阴影最常用的算法。主要问题是分辨率、深度精度带来的混叠、阴影痤疮和漏光。图形学屏幕空间反射Screen-Space Reflections屏幕空间反射 (SSR) 沿反射方向在深度缓冲中步进求交,命中后从颜色缓冲读取入射辐射亮度。由于镜面瓣窄、只需反射方向附近的光,屏幕数据比漫反射情况更可能包含所需信息。它最早由 Sousa 等提出,常作为镜面 GI 的第一层,失败时退回反射探针和全局探针(RTR4 11.6.5 节)。图形学线框与线条渲染Wireframe & Line Rendering实心"硬"线条看似简单,却在 CAD、选中高亮、技术插图中很重要。难点在于:线与三角形位于同一位置时如何保证线在前面;如何隐藏或淡化被遮挡的线;线交叉时如何用光晕表现前后关系。图形学像素与帧缓冲优化Pixel & Framebuffer Optimization需要着色的像素通常远多于顶点,所以像素处理优化往往最划算。核心手段:保证占用率以隐藏纹理延迟、按距离切换着色器 LOD、利用 early-z 并通过从前往后排序或 z-prepass 减少过度绘制、缩小帧缓冲每像素存储(色度子采样、YCoCg 棋盘),以及只在需要时开启混合、避免 GPU 回读。几何与光栅化阶段的常用优化也一并列出。图形学遮挡剔除Occlusion Culling遮挡剔除尽早剔除被其他物体挡住的物体,避免它们在 z-buffer 中被光栅化、深度比较甚至着色。本页覆盖遮挡剔除的分类与通用框架、GPU 遮挡查询、层次 Z 缓冲 (HZB) 及其在现代引擎中的简化变体(含两遍法、软件光栅化遮挡),以及在 CPU/GPU 上按物体—簇—三角形多粒度组合剔除并用间接绘制提交的剔除系统。图形学硬件深度剔除与纹理单元Hardware Depth Culling & Texture UnitsGPU 的深度管线先在瓦片级用 HiZ 单元做 zmax/zmin 粗剔除,再逐采样做 early-z 深度测试以免执行被遮挡片元的像素着色器,必要时退回到着色后的 late depth test;深度缓冲同样有瓦片压缩与快速清除。纹理单元以固定功能硬件完成寻址、过滤、钳位与解压(比软件快可达 40 倍),按 quad 有限差分求导数以选择 LOD,并依靠瓦片化/Morton 交织存储和纹理缓存提高局部性。图形学天空盒与固定视点技术Skyboxes & Fixed-View Techniques用图像代替三角形时,渲染代价与像素数而不是顶点数成正比。Lengyel 的"渲染谱系"从纯图像方法一直排到三角形和光线追踪。本页汇总谱系中偏图像一端的技术:限制视点移动的固定视点加速、渐进细化与重光照、天空盒、光场渲染以及精灵与分层(RTR4 13.1–13.5 节)。图形学光栅化Rasterization光栅化(也叫扫描转换)把屏幕空间里带深度和着色数据的顶点,转换成三角形覆盖的像素(片元),交给像素处理阶段。它是几何处理和像素处理之间的同步点:三个顶点在这里组成三角形。图形学延迟纹理与可见性缓冲Deferred Texturing & Visibility Buffer延迟着色避免了着色的过度绘制,但生成 G-buffer 时仍有过度绘制:先画的物体读了大量纹理,被后画的物体挡住后这些带宽全部浪费。延迟纹理只用一遍几何 pass、存极少的数据(纹理坐标与切线基,或仅三角形与实例 ID),直到着色时才读纹理。由于 GPU 算力增长快于带宽,让瓶颈落在计算而非缓冲访问被视为面向未来的做法。图形学绘制调用与状态切换优化Draw Calls & State Change Optimization调用图形 API 的开销主要在 CPU 端的驱动里:状态切换昂贵,每次绘制调用有固定开销,大量小批次会让 GPU"饿死"。对策是:合理放置缓冲;按状态代价排序分组;共享纹理和着色器;合并网格和实例化以减少调用;并用一个整数排序键同时兼顾状态分组与前后排序。图形学坐标空间Coordinate Spaces顶点从模型到屏幕要依次经过模型空间、世界空间、观察空间、裁剪空间、标准化设备坐标 (NDC)、窗口坐标。每一步变换都有明确目的,大部分可以用 4×4 矩阵表示并相乘合并。游戏美术AC Black Flag 水深遮罩Black Flag WaterplaneGAT 64:水面平面切开船体是常见伪影。大船靠「看不见船腹」与位移遮罩推水;小船用只写深度的隐形盖板(Depth Mask),让后续水面深度测试失败,船舱保持干燥。