Early -z Test

  • 什么是Early-z,为什么需要Early-z?

渲染管线:顶点着色器(可以进行顶点mvp变换等)->曲面细分着色器(Tessellatioin 细分控制着色器 细分计算着色器)->几何着色器->剔除(正反面剔除)裁剪-> 三角形设置 三角形遍历->三角形光栅化(顶点插值生成三角形)->[ealy z test] ->像素着色器->alphatest->depth test. 

Early-z 是 发生在顶点着色器后像素着色器之前的深度测试。

由于渲染管线中 深度测试在像素着色器后执行导致渲染的像素,执行完深度测试后被丢弃这无疑是很浪费的,所以 early-z 就被发明出来了。

背景

在了解early-z 之前 先看一下 OpenGL 渲染管线中 都有那些测试。

在网上查看资料有两种 一种是 Per-Sample Processing (每采样处理) 一种是 Per-Fragment_Operations(每像素处理)

                                                                     (每像素处理)

究竟采用上面那种?不重要,重要的是只要知道alpha test 在 深度测试之后执行,这个也是理解为什么alpha test 会使得 early-z失效的关键因素。

1 开启 alpha test (因为如果提前进行深度测试,深度会提前写入,这会导致后面进行alpha test 的时候,但是如果没有通过alpha测试这个像素的渲染就是无效的被丢弃,这样等于一个么有通过alpha测试的像素,深度值却被写入了,会让后面的渲染产生错误的效果).

2.在片段着色器中使用 discard关键字。因为这在一些硬件上执行的时候,相当于已经关闭了深度测试。

但是在一些硬件上也会强制执行提前进行深度测试以OpenGL为例比如使用 

layout(early_fragment_tests) in;

总结:

因此为了性能考虑我们应该尽量不适用影响提前进行测试的操作 alpha test, discard操作等。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值