每天一個圖形學知識——6,高階紋理之渲染紋理(後處理效果下)
接著上一篇,繼續講一些常見後效的原理。
高斯模糊:
模糊的實現有好多種,有均值模糊以及中值模糊,均值模糊也用到了我們上篇文章講到的卷積,不過是每個因子都相同的卷積。
但是最常用的還是高斯模糊。高斯模糊的運用可以說是很多後處理效果的基礎,比如後面要講的Bloom效果的實現,以及UI中常用的毛玻璃效果虛化背景的效果。
高斯模糊也是運用到了卷積計算,其卷積核叫做高斯核。其核心公式如下:
解釋一下里面的係數的意思,分母那個代表著標準方差,一般為1,x和y分別代表當前位置離卷積核中心的整數距離。
高斯方程很好地模擬了領域每個畫素對當前畫素的影響程度——距離越近,影響越大。高斯核的維數越高,模糊程度越大。但是我們觀察公式,在取樣時不需要計算全部核上的值,一個5x5的卷積核,我們只需要三個權重即可。
我們先後呼叫倆個Pass,第一個使用豎直方向的一維高斯核對影象進行濾波,第二個Pass再使用水平方向的一維高斯核對影象進行濾波,得到最終的目標影象。
在實現中,我們還將使用影象縮放的方式進一步提高效能,簡而言之就是降低解析度,這樣模糊的效果也提升了,效能也下降了。我們可以透過調整高斯濾波的應用次數來控制模糊程度(次數越多,影象越模糊)。
Bloom效果:
Bloom效果是模擬真實攝像機的一種效果。可以讓畫面中較亮的區域“擴散”到周圍的區域中,造成一種
朦朧
的感覺。
實現原理很簡單,我們首先根據一個亮度閾值提取出影象中的較亮的區域,將這張影象儲存到一張渲染紋理中(這張紋理如果想看的話可以在unity的framedebug裡面看),再利用高斯模糊對這張渲染紋理進行模糊處理,模擬光線擴散的效果,最後再將其和原影象進行混合,得到最終的結果。
過程很簡單,而且在unity的最新的URP渲染管線中有預設自帶的效果。
運動模糊:
運動模糊也是模擬真實世界攝像機的一種效果。具體效果就不介紹了,玩過3D遊戲的都知道。運動模糊在高速遊戲裡很好用,很能營造出一種速度感。
實現的思路也有很多種,一種是利用一塊
累積快取(accumulation buffer)
混合多張連續的影象。然後取幾張影象的平均值作為最後的運動模糊影象。但是這種方式是很暴力而且消耗效能的。
所以,另一種方式是建立
速度快取(velocity buffer)
,速度快取和顏色快取,深度快取等等都一樣,也是一張渲染紋理,裡面記錄的是每個畫素的速度值。我們可以使用這樣一種快取從而計算出模糊的方向和大小。