笔记19 Early-z和Z-prepass
(前置) 深度测试 Depth Test
位置:见 读书笔记01《Unity Shader入门精要》 GPU 流水线,深度测试 在 逐片元操作。
用途:解决物体可见遮挡性的问题
提前深度测试 Early-Z
读书笔记01《Unity Shader入门精要》失效情况
1.开启 Alpha Test 或 clip/discard 等手动丢弃片元操作
2.手动修改GPU插值得到的深度
3.开启 Alpha Blend 【深度写入 ZWrite Off】
4.关闭深度测试 Depth Test
高效利用
通过 CPU 将物体距离摄像机从近到远排序后,再交给 GPU 进行渲染。
(但场景十分复杂的时候,频繁的排序操作将大大降低 CPU 的性能。并且如果严格按照由近到远进行渲染的话,将不能同时搭配 合批 优化手段)
另一种方法就是 使用Z-Prepass。
使用Z-Prepass
方式1:双Pass法
在第一个Pass,即Z-Prepass中只写入深度,不计算输出任何颜色;在第二个Pass中关闭深度写入,并且将深度比较函数设置为相等。
这样一来,每一个物体都会渲染这两个pass,所有物体的 Z-Prepass 结果就自动形成了一个最小深度的深度缓冲区 Z-Buffer。无需 CPU 排序。
1 | Shader"Custom/EarlyZPresentation"{ |
一个物体拥有多个 Pass 的 Shader 是无法进行动态批处理的。这就会带来 DrawCall 的问题。
↓ 所以又有方式2
方式2:提前分离的Prepass
将原先第一个 Pass(即Z-Prepass)单独分离出来为单独一个Shader,并先使用这个Shader 将整个场景的 Opaque 的物体渲染一遍。而原先材质只剩下原先的第二个 Pass,仍然关闭深度写入,并且将深度比较函数设置为相等。
这样就不影响批处理了。
不是很懂怎么实操欸,记得试试。(补作业的时候一块做)
此外,Z-Prepass 也是透明渲染的一种解决方案。
读书笔记07《Unity Shader入门精要》 中的 开启深度写入的半透明效果)Z-Prepass所带来的问题
额外的性能消耗。所以需要权衡。
-作业-
1、做下 Z-Prepass 的效果测试
2、总结 EarlyZ 的限制
- 标题: 笔记19 Early-z和Z-prepass
- 作者: 铁名_IronName
- 创建于 : 2026-04-03 21:10:13
- 更新于 : 2026-04-04 13:22:02
- 链接: https://blog.ironname.top/2026/BRPlan/笔记19-技术美术百人计划/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论