这篇文章将尝试讲清楚三个最常见却最容易混淆的图形学“缓冲区”——帧缓冲区(Frame Buffer)、深度缓冲区(Depth Buffer / Z-Buffer)、模板缓冲区(Stencil Buffer)。内容覆盖工作原理、Unity 中的使用方式、常见坑与实战建议。
总览:它们分别解决什么问题?
-
帧缓冲区:存放“最终要显示的像素颜色”。你看到的画面最终写到这里(屏幕后备缓冲或 RenderTexture)。
-
深度缓冲区:存放“每个像素离相机的深度”,用于遮挡判断(近的挡住远的)、早期剔除与抗过绘。
-
模板缓冲区:每像素 8 位整数,提供条件渲染/掩码能力(例如 UI Mask、局部后处理、Portals 等)。
片段级流水线中,模板测试与深度测试同属“每片段测试阶段”(在 OpenGL 中通常先做模板再做深度;在 D3D 中两者同阶段并可针对不同通过/失败配置不同操作)。你可以分别指定当 ZTest 通过/失败 时模板值该如何修改,因此不需要假定固定顺序。
1. 帧缓冲区(Frame Buffer)
1.1 它是什么
显存里承接绘制结果的“画布”。通常包含:
-
颜色附件(一个或多个,MRT):RGBA 纹理,可能是 LDR(如 ARGB32)或 HDR(如 ARGBHalf)。
-
可选深度/模板附件:和颜色附件绑定到同一个渲染目标上(例如 D24S8)。
Unity 中的两类“帧缓冲”:
-
默认后备缓冲(Backbuffer):相机直接画到屏幕。
-
RenderTexture:自定义帧缓冲(
Camera.targetTexture
),用于离屏渲染、后处理链、多相机合成、UI 贴图等。
1.2 常见设置与注意点
-
色彩空间:Linear/ Gamma 与 sRGB 采样/写入一致性。
-
HDR:需要更高动态范围(Bloom、曝光),选用
ARGBHalf
等。 -
MRT:延迟渲染/自定义 GBuffer。
-
MSAA:多重采样抗锯齿,颜色与深度/模板可多样本存储。
-
平台兼容性:移动端对某些颜色/深度格式或 MSAA + HDR 组合有限制。
2. 深度缓冲区(Depth Buffer)
2.1 作用与原理
-
遮挡判断:对同一屏幕像素的多个片段,根据深度比较仅保留“更近”的那一个。
-
早期深度测试(Early-