学习进度
0/9 已勾只保存在这台浏览器;勾满 9 项即视为本题完成。
先把题目说成人话
镜头前的一个小格子被墙、机器零件和蒸汽轮流盖住:不透明物体最后只看最前面那层,后面几层若都认真上色就白忙了;透明蒸汽却必须一层层混合,不能直接丢弃。先让物体只记录离镜头多远,再正式画颜色,这一步叫深度预渲染(Depth Pre-Pass);它可能省掉隐藏像素的工作,也会多付一次几何和深度读写成本。
这是虚构教学故事,不是个人项目经历。
场景:先让问题变得看得见
几层不透明机械结构前后遮挡,最前面还有透明蒸汽。重叠调试图在这里很亮,但它把两种情况染在了一起:不透明零件最后只看离镜头最近的一层;透明蒸汽却要把后面的颜色一层层混进来,不能简单扔掉。
因此“同一个小格被画很多次”只是现象。要不要先写距离,取决于隐藏表面的上色有多贵、重新画一遍几何有多贵,以及目标手机怎样在芯片内部保存深度和颜色。
(右脑)画面: 几块不透明铁板前后重叠,油漆工从最后一块一路刷到最前面,收工时却只能看见离眼睛最近的那块,后面的油漆全被盖住了。若开工前先用粉笔记下每个位置最靠前的是哪块铁板,许多藏在后面的地方就不必认真上色。旁边的半透明纱布却不同:它本来就要让后面的颜色透出来,不能只留下最前面一层。
(左脑)对表: 先在帧调试器中确认管线是否已经生成深度:通用渲染管线(URP)可能因深度纹理、深度法线或深度预填充(Depth Priming)已有 DepthOnly/DepthNormals,也可能选择 CopyDepth,不能再盲目叠一套。若确实需要候选预渲染,就让不透明物体先执行深度步骤(Depth Pre-Pass),颜色步骤使用同一深度与裁剪规则;硬件的提前深度拒绝(Early-Z)才有机会在片元着色前挡掉隐藏表面。分别记录新增顶点、绘制与深度读写,以及减少的不透明片元时间;透明混合仍按原顺序验收。
小明:先形成一个完整猜测
小明给全场景增加 DepthOnly Pass,期待 Early-Z 自动解决所有重叠。透明蒸汽没有变快,叶片类 Alpha Clip 材质还因为深度阶段和颜色阶段各做一次裁剪而增加了工作。
他的模型抓住了“先有深度就能早拒绝”,却把所有材质当成同一种。普通透明为了正确混合往往不写深度;若强写最近一层,后面的透明层会错误消失。预深度不能替代透明层数、覆盖面积和粒子 Shader 的治理。
小红:把猜测放回现实检查
小红先在 Frame Debugger 中确认 DepthOnly、Opaque 和 Transparent 的真实顺序,再用 GPU 时间只比较不透明预深度开关:
- 在几何较简单、遮挡严重且片元着色昂贵的机械区,预深度让隐藏片元在颜色 Pass 前通过深度测试被拒绝,节省可能大于额外深度 Pass。
- 在顶点密集、遮挡很少或片元很便宜的区域,额外绘制更可能让整帧变慢。
- Alpha Clip 要保证深度 Pass 与颜色 Pass 使用相同的裁剪规则;否则会出现错误遮挡。即使规则一致,也可能把纹理采样做两次。
她还检查 Shader 是否写深度、使用 discard/clip、修改片元深度或包含会限制提前深度测试的行为,因为这些前提会影响硬件能否在昂贵片元工作之前拒绝像素。
我:用检查结果修正模型
我先用 Frame Debugger 确认 URP 当前的 Depth Priming、DepthOnly/DepthNormals 与 CopyDepth 路径,避免同一对象已经预写深度又被自定义 Pass 重画。随后只把可能受益的不透明队列列为预深度候选,并保留开关做目标设备 A/B。对不透明物体,还先尝试合理的前到后排序、遮挡剔除和降低被遮挡 Shader 成本;对透明粒子,则缩小贴片空白、减少屏幕覆盖与同时存在层数,必要时降分辨率或改用更适合的近似。
最终验收同时看 Depth Pass 增加了多少几何工作、Opaque 片元时间减少多少、Transparent 是否原样,以及 tile GPU 上额外 attachment load/store 的代价。只有整帧在同一捕获下变快,Depth Pre-Pass 才是这台设备和这组内容的答案。
(右脑)画面修正: 小明让铁板、带孔的树叶和透明蒸汽都先去画粉笔记号,蒸汽没有因此少画,树叶反而要先剪一次轮廓、上色时再剪一次。小红只把前后遮得很重、真正上色又很费工的铁板留下来试;空旷处的铁板本来就很少互相遮住,再多走一趟反而可能更慢。眼前只能看出哪些地方值得试,是否真的省时,还得让同一台机器把改前和改后各跑一遍。
(左脑)严格对表: 先固定目标设备和捕获镜头,按队列标出 DepthOnly、Opaque、Alpha Clip 与 Transparent;记录无预深度基线,再只让候选不透明对象进入一致的 DepthOnly Pass,确保裁剪规则与颜色 Pass 相同;分别比较 Depth Pass 顶点/带宽、Opaque 片元时间、Transparent 时间和整帧 GPU。若整帧统计量稳定下降且无透明丢层、错误遮挡或 tile 带宽回退则保留,否则关闭;前到后排序和透明覆盖治理作为独立方案单测。
老师解惑
- Early-Z 是硬件在片元着色前尽早做深度拒绝的机会;Depth Pre-Pass 是主动提前准备深度的一种渲染策略,两者不是同一个概念。
- Unity 2022.3 的 URP 可能已经因 Depth Priming、DepthOnly/DepthNormals 或深度纹理需求执行相关步骤;先看真实帧,再决定是否增加自定义预深度。
- 预深度主要帮助被遮挡的不透明片元。普通 Alpha Blend 透明仍需累积后层颜色。
- 多一个 DepthOnly Pass 意味着额外顶点处理、Draw、深度写入和可能的带宽成本。
- Overdraw 可视化显示重叠,不直接显示每一层 Shader 的时间;还要结合 GPU 捕获判断昂贵的是哪类片元。
工具分工
- Rendering Debugger/Overdraw 视图:找重叠区域并区分材质队列。
- Frame Debugger:核对预深度、颜色 Pass、透明 Pass 的顺序和对象。
- Unity Profiler GPU Usage 或平台 GPU 工具:测预深度前后各阶段时间,判断净收益。
- overdraw-depth-normal Lab:观察深度已有与否如何影响不透明片元,及透明为何是另一类问题。
记忆钩子
预深度是先花一次便宜深度,换掉后面昂贵的隐藏像素;透明层和顶点成本不会因此消失。
这是教学场景,不是目标项目的真实捕获或个人经历。
下一步:验证这条因果
分开验证叠层、深度预写和法线采样成本。
教学边界:它只验证这一条画面因果,不替代完整答案、项目经历或目标设备数据。