天天看點

淺談HiZ-buffer

HiZ-buffer Occlusion Culling

最近在看基于GPU的遮擋裁剪相關的技術,它本身也是GPU-Driven Rendering Pipleline的其中一環。這項技術充分利用compute shader并行計算的威力,在加速遮擋查詢的效率的同時,可以降低查詢的延遲。很多文章和paper中都在使用一項稱為Hierarchical Z-buffer的技術來作為遮擋查詢的重要環節。那麼什麼是Hierarchical Z-buffer呢?利用它的優勢又是什麼呢?今天就簡單解釋一下HiZ-buffer的基本原理,在實際的使用過程中,雖然不同遊戲使用了不同的優化手段,但是核心的原理都是一樣的。

我們假設如下圖所示的場景,該圖是橫切面圖,相機是從Z0看向Z1。下面我們就通過該例子來看下,如何使用Hierarchical Z-Buffer來将綠色的物體判定為被遮擋 ,進而将其裁剪掉。

淺談HiZ-buffer

上圖中z = 0是近裁剪面,z = 1是遠裁剪面。首先我們将遮擋物(紅色和藍色)進行光栅化,得到一個z-buffer,如下圖豎着的那根灰色的線就代表了光栅化後的深度值。

淺談HiZ-buffer

接下來就是最重要的一步,下采樣z-buffer,得到一串mipmap層級貼圖(該mipmap層級圖就稱為Hierarchical Z-buffer,或者abbreviated HiZ-buffer)

在下采樣的過程中,使用的max操作,也就是說兩個相鄰的像素合下采樣為一個像素時,使用的兩者中最大的那個的值。如下圖所示:

淺談HiZ-buffer

由上圖可以看出,每一次下采樣,都是對上一層級的保守估計,到了第4級就隻剩下一個深度值了。由于下采樣的時候用的是max操作,是以如果一個物體在level 2中深度值判定為被遮擋,那麼它肯定在level 1中也是被遮擋的。

得到HiZ-buffer之後,我們就可以基于它來進行遮擋裁剪了:

計算得到綠色物體的AABB包圍盒,該包圍盒的x-max/min和y-max/min用來決定采樣哪一層級的HiZ-buffer(也就是看哪一層級的尺寸能夠涵蓋包圍盒的所有像素),在本例中該AABB包圍盒符合level 2,是以我們選擇采樣level2,進而得到一個z-buffer的保守估計。接下來我們比較aabb.zmin跟我們采樣到的深度值,得知aabb.zmin < z-buffer.sample,是以綠色物體是被遮擋的,應該被裁剪掉。

淺談HiZ-buffer

以上的方法就是基于Hierarchical Z-buffer的遮擋裁剪。可以看出如果沒有HiZ-buffer,我們将不得不采樣四個樣本才能确定一個物體是否被遮擋了,HiZ-buffer大大減少了紋理采樣的次數,提高了遮擋查詢的效率。

繼續閱讀