提前的深度模板测试(Early-Z)

2024-08-04  本文已影响0人  陈成_Adam

深度测试的目的是把 3D 模型中被遮挡的像素部分丢弃。
例如,射击游戏中,某个门背后藏了一个老 6,我们看到的只有门,而那个老 6 是被门遮挡的,不需要显示出来。

怎么判断是否被遮挡?
每个像素都有深度值,也就是像素距离眼睛的距离,距离近的会遮挡距离远的。

OpenGL 规范中所描述的渲染管线,像素的深度测试是发生在像素着色之后的。
而主流显卡都提供了 EarlyZ 的功能,即提前深度测试。将深度测试提前于像素着色。

EarlyZ 的好处很明显:可以提前扔掉一些被遮挡的像素,避免在像素着色和像素后处理中额外浪费功耗和时间。

能用 EarlyZ 就不用 LateZ。

EarlyZ 什么时候开启?满足以下任意一个条件时,不能启用 EarlyZ,
● 像素着色阶段会修改像素的深度时
● 像素着色阶段会丢弃某些像素时(使用 Discard 或者 Clip 关键字),
● 开启 Alpha 测试时
● 开启 Alpha-to-coverage 功能时

为何在像素着色阶段会修改像素的深度时不能启用 EarlyZ?
举一个反例,
有一个像素的深度值是 0.3,
深度测试的设置:深度值小于 0.5 则丢弃;像素着色的设置:将像素的深度修改为 0.8
期望的结果是不丢弃该像素,但 EarlyZ 阶段会丢弃该像素,因为 0.3 小于 0.5。

为何在像素着色阶段会丢弃某些像素时(使用 Discard 或者 Clip 关键字)不能启用 EarlyZ?
举一个反例,
有一个像素的深度值是 0.8,其对应位置的深度缓冲区的深度值为 0.3,
深度测试的设置:深度值小于 0.5 则丢弃;像素着色的设置:丢弃上述像素
期望的结果是深度缓冲区的深度值为 0.3,但 EarlyZ 阶段会修改为 0.8,因为深度测试通过了。

为何在开启 Alpha 测试时不能启用 EarlyZ?
举一个反例,
与上面的例子类似,开启 Alpha 测试会丢弃某些像素,如果开启 EarlyZ 会错误地更新深度缓冲区。

为何在开启 Alpha-to-coverage 功能时不能启用 EarlyZ?
举一个反例,
与上面的例子类似,开启 Alpha-to-coverage 功能会丢弃某些像素,如果开启 EarlyZ 会错误地更新深度缓冲区。

上一篇 下一篇

猜你喜欢

热点阅读