硬件深度剔除与纹理单元
Hardware Depth Culling & Texture Units
GPU 的深度管线先在瓦片级用 HiZ 单元做 zmax/zmin 粗剔除,再逐采样做 early-z 深度测试以免执行被遮挡片元的像素着色器,必要时退回到着色后的 late depth test;深度缓冲同样有瓦片压缩与快速清除。纹理单元以固定功能硬件完成寻址、过滤、钳位与解压(比软件快可达 40 倍),按 quad 有限差分求导数以选择 LOD,并依靠瓦片化/Morton 交织存储和纹理缓存提高局部性。
深度精度(23.7 节)
深度相近的面(如略高于桌面的纸)因精度限制互相穿插,称为 z-fighting;完全共面则是建模问题,提高精度也无法解决。深度缓冲每像素(或采样)24 或 32 位,定点或浮点。正交投影下深度分布均匀,透视下不均匀:,定点表示时把有效范围(DirectX 为 [0,1])映射到 。
HiZ 粗深度测试
流程:粗光栅化(瓦片级)→ HiZ 单元粗测 → 采样覆盖与深度插值 → 深度单元 early depth test → 像素着色器 → late depth test,配合深度缓存、瓦片表和压缩。
- zmax 剔除(Greene 分层 z 缓冲的简化):每个瓦片(常 8×8)存最大深度 (片上存储或经 HiZ 缓存)。若三角形在瓦片内的最小深度 ,它在该瓦片中必被遮挡,可终止处理,省下逐像素深度测试(不省像素着色,因为逐采样测试本来也会剔掉)。 用保守估计:取三顶点最小 z(开销小但不总是准)、或用三角形平面方程在瓦片四角求值取最小;两者结合取较大者剔除效果最好。
- zmin 剔除:存瓦片最小深度。三角形肯定在所有已绘几何之前时可跳过逐像素测试、甚至避免读 z 缓冲;同时有 zmin 与 zmax 就能支持所有深度比较函数,而非仅"小于"。
- 更新:三角形覆盖整个瓦片时可直接在 HiZ 单元更新,否则需从深度缓存读回整瓦片归约出最值,会引入延迟(Andersson 等提出无需该反馈仍保留大部分剔除效率的方法)。
early-z 与限制
early-z 就是把逐采样深度测试移到像素着色器之前,丢弃被遮挡片元;它常与 z-culling 混淆,但由完全独立的硬件实现,二者可单独使用。zmax、zmin 剔除和 early-z 在多数情况下自动启用,但像素着色器写自定义深度、使用 discard、或写 UAV 时必须禁用,退回 late depth test。新硬件上着色器可做原子读改写等,若确定安全可显式开启 early-z;保守深度:程序员保证自定义深度大于三角形深度时,可启用 early-z(此例中 zmax 剔除也可,但 zmin 剔除不行)。前到后渲染有利于遮挡剔除;z-prepass 先只写深度,再用"相等"测试着色,只着色最前面的表面。
深度压缩与第 23.5 节的通用系统类似:几种固定压缩大小加未压缩退回,快速清除省带宽;因深度屏幕空间线性,常用高精度平面方程、差分的差分加增量编码或锚点法。瓦片表与 HiZ 缓存可全放片上(昂贵,需容纳最大支持分辨率)或经内存层次。
纹理单元(23.8 节)
导数:计算纹理 LOD 需要 、、、。纹理坐标若经任意函数变换(如凹凸法线反射向量去查环境贴图),解析求导不可行,所以硬件在 quad(2×2 像素)上用 x、y 方向有限差分计算——这正是 GPU 围绕 quad 调度的原因。实现常用 quad 内跨 lane 的 shuffle/swizzle 指令(编译器插入)或固定功能硬件;没有精确规范。OpenGL 4.5 与 DirectX 11 提供粗导数(整个 quad 共用一个水平和一个垂直差分)和细导数(用离像素最近的差分)。
纹理缓存:所有 GPU 都用(SRAM),有的专用一到两级,有的与其他访问共享。纹素按小瓦片(如 4×4)存储,瓦片字节数常等于缓存行(如 64 B)。另一种是交织 (swizzle) 布局:定点纹理坐标各 位,
为基址, 为每纹素字节数;交错 u、v 的位得到二维 Morton 序空间填充曲线,提高一致性。
解压与 mipmap:纹理单元内有专用硬件解压多种压缩格式,远比软件高效。渲染目标随后作为纹理使用时,可先整体解压再存储,或让纹理单元直接支持颜色缓冲压缩格式(后者更高效,渲染目标作为纹理时仍保持压缩)。mipmap 限制了纹素/像素比(遍历中每像素约走一个纹素),保证缓存局部性——是少数同时改善画质和性能的技术之一。
| 机制 | 节省的东西 | 禁用条件 |
|---|---|---|
| zmax 剔除 | 被遮挡瓦片的逐像素深度测试 | 写自定义深度等(保守深度时可保留) |
| zmin 剔除 | 深度缓冲读取,支持任意比较函数 | 同上 |
| early-z | 被遮挡片元的像素着色 | 写深度、discard、写 UAV |
| z-prepass | 重复着色(只着色最前表面) | 需额外一遍几何 |
出处
- realtime_rendering_4ed.pdf 第 23 章 Graphics Hardware