Unity Shader URP 什么是early-z 什么是hi-z 什么是层级深度缓冲

  • Early-Z = 硬件自动把深度测试挪到像素着色器之前,省着色开销;用 discard 会破坏它
  • Hi-Z = 用深度金字塔数据,在三角形光栅化之前就整体剔除,省得更彻底
  • 层级深度缓冲 = Hi-Z 依赖的数据结构本体,把深度缓冲做成 Mip-map 形态

实际写 URP Shader 时,保持 ZWrite On + 不用 discard + 不透明队列保持前后排序,这三条规则就能把三种优化都喂饱。

Hi-Z 剔除逻辑1. 取三角形在屏幕上的包围盒2. 选取能覆盖包围盒的最小 Mip 层3. 读取该层的最大深度值 Z_max4. 比较三角形最近深度 Z_tri:Z_tri > Z_max三角形肯定被遮挡,整体跳过光栅化5. 否则进入正常光栅化流程关键点:读 1~4 个纹素就能剔除整个三角形,极其高效* 深度方向:1.0=最远,0.0=最近(默认)取最大值 = 保守估计遮挡物位置

Early-Z、Hi-Z与层级深度缓冲性能对比表

特性 普通 Late-Z Early-Z Hi-Z(层级深度缓冲)
剔除粒度 逐像素(着色后) 逐片元(着色前) 整个三角形区域
节省的开销 无(基准) 像素着色计算 光栅化 + 着色计算
额外内存 +约 33%(金字塔层)
实现方式 硬件自动 硬件自动(无 discard 时) 硬件自动 / GPU Culling
对 Shader 的要求 不用 discard / clip ZWrite On,不透明队列
URP 是否默认开启 ------ 是(取决于 GPU)