开场
老张最近在做一个开放世界手游,场景里堆了几万棵草、几百万个面,帧率死活卡在 30 帧下不来。Profile 一看,GPU 耗时爆炸:主角脚下的草地明明被石头挡住了,GPU 却还在一片一片地把草叶“画完”再扔。老张百思不得其解:“深度测试不是会把看不见的像素丢掉吗?怎么还这么慢?”
答案藏在渲染管线的默认顺序里——教科书上,GPU 是先把像素着色完,再做深度测试。哪怕一个像素最后被深度测试干掉,前面 Shader 里那一堆采样、光照、PBR 计算也已经实打实跑完了。好比装修时先刷墙再验房,验完发现这面墙要砸掉重砌,前面全白忙活。
Early-Z(提前深度测试)就是 GPU 厂商塞进管线的一招“偷懒艺术”:把深度测试挪到像素着色之前,被挡的像素直接拦在门外,Shader 一行都不用跑。这篇文章讲清楚它是什么、靠什么条件生效、什么时候失效、以及工程上怎么把它喂饱。
一、核心概念:Early-Z 是什么
1.1 先看“标准”流程浪费在哪
没有 Early-Z 介入时,光栅化之后的执行流程是:
光栅化 → Fragment Shader(重活全在这)→ 深度测试 → 混合 → 写屏
对着色器代码来说,意味着下面这个 Shader 里所有的计算,对这个像素最终是否可见毫不知情:
fixed4 frag(v2f i) : SV_Target
{
// 1. 采样贴图、算光照(重活)
half3 albedo =
订阅专栏 解锁全文

253

被折叠的 条评论
为什么被折叠?



