【TA-霜狼_may-《百人计划》】图形3.5 Early-z 和 Z-prepass

3.5.1 深度测试

在这里插入图片描述
用于解决可见物体的遮挡问题
可以对深度测试的条件进行自定义

深度测试带来的问题

被遮挡的物体由于不会出现在屏幕上造成性能浪费。

3.5.2 Early-Z

在这里插入图片描述
在片元着色器计算之前就引入深度测试,剔除不需要的片元。

补充

Early-Z的过程中还可以添加模板测试

失效情况

  1. 开启Alpha Test 或clip/discard 等丢弃片元操作;
  2. 手动修改GPU插值得到的深度:情况同1
  3. 开启Alpha Blend:一般开启透明度混合的物体会关闭深度写入,ZWrite Off
  4. 关闭深度测试 Depth Test

高效利用Early-Z

若下图中渲染顺序由远及近(3-2-1),则没有优化效果
在这里插入图片描述
理想情况:由近到远排序物体再进行渲染

3.5.3 Z-prepass

使用两个Pass:

  • 在第一个Pass即Z-Prepass中仅仅只写入深度,不计算输出任何颜色;
  • 在第二个Pass中关闭深度写入,并且将深度比较函数设置为相等;
  • 若测试失败将不进行任何后续的片元计算,节省资源;

由此,每一个物体都会渲染这两个pass,所有物体的Z-Prepass结果就自动形成了一个最小深度的深度缓冲区Z-Buffer。

区别在于:如果是手动排序的话耗费大量cpu计算,如果是Z-Prepass的话,还是GPU计算。

伪代码实现:
在这里插入图片描述

随之带来的问题——动态批处理

一个物体拥有多个pass的shader是无法进行动态批处理,也就是使drawcall翻倍,如下:
在这里插入图片描述

方式2:提前分离的PrePass

  • 将原先第一个Pass(即Z-Prepass)单独分离出来为单独一个Shader,并先使用这个Shader将整个场景的Opaque物体渲染一边。
  • 原先材质此时只剩下第二个Pass,仍然关闭深度写入,并且将深度比较函数设置为相等。
    在这里插入图片描述

3.5.4 Z-Prepass的其他问题

Z-Prepass的计算消耗:经过实验可以看到在小场景下可能并不能提高效率;
应当根据实际情况选择是否使用Z-Prepass
在这里插入图片描述
通过对两种方法进行结合,达到正确的渲染效果。(能够渲染出头发的背面)

作业

preZ的效果测试

没有事先写入Zbuffer的效果
在这里插入图片描述
通过添加下述Pass,达到preZ的目的

// Extra pass that renders to depth buffer only
		Pass {
			ZWrite On
			ColorMask 0
		}

preZ结果展示
在这里插入图片描述

总结earlyZ的限制

  • Early-Z是硬件支持的功能,无法通过API来进行调用
  • 如果进行了Alpha Clip或者深度写入,会造成EarlyZ失效
  • Early-Z通常是通过preZ来实现的,但是在DrawCall特别高的场景中使用preZ会造成负优化(大量的排序占用性能)
  • 如果开启了Alpha Test(Discard),会导致Early-Z失效,即使遮挡也会再次进行Pixel计算;
  • Alpha Blend可以和Early-Z同时生效,可以进行正确的Early计算(因为关闭了深度写入)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zczplus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值