-
什么是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操作等。