1. 程式人生 > >Unity Shader屏幕後處理效果

Unity Shader屏幕後處理效果

屏幕後處理效果(screen post-processing effects)是遊戲中實現螢幕特效的常見方法。通常是指在渲染整個場景得到螢幕影象後,再對這個影象進行一系列操作,實現各種螢幕特效。使用這種技術可以為遊戲畫面新增更多的藝術效果,例如景深(Depth of Firld)、動態模糊(Motion Blur)等。Unity為我們提供了這樣一個方便的介面-OnRenderImage函式:

MonoBehaviour.OnRenderImage(RenderTexture src,RenderTexture dest)

當我們在指令碼中宣告此函式後,Unity會把當前渲染得到的影象儲存在第一個引數對應的源渲染紋理中,通過函式中的一系列操作後,在把目標渲染紋理,即第二個引數對應的渲染紋理顯示到螢幕上。我們通常是利用Graphics.Blit函式來完成對渲染紋理的處理。

public static void Blit(Texture src,RenderTexture dest);
public static void Blit(Texture src,RenderTexture dest,Material mat,int pass = -1);
public static void Blit(Texture src,Material mat,int pass = -1);

利用卷積(convolution)進行影象的邊緣檢測

卷積操作指的是使用一個卷積核(kernel)對一張影象中的每個畫素進行一系列操作。卷積核通常是一個四方形網格結構,該區域內每個方格都有一個權重值。當對影象中的某個畫素進行卷積時,我們會卷積核的中心放置於該畫素上,翻轉核之後再依次計算核中每個元素和其覆蓋的影象畫素值的乘積並求和,得到的結果就是該位置的新畫素值。
在這裡插入圖片描述


在這裡插入圖片描述

高斯模糊

高斯模糊同樣利用了卷積計算,它使用的卷積核名為高斯核。高斯核是一個正方形大小的濾波核,其中每個元素的計算都是基於下面的高斯方程:
在這裡插入圖片描述

Bloom效果

Bloom讓畫面中較亮的區域“擴散”到周圍的區域中,造成一種朦朧的效果。
Bloom效果實現原理:首先根據一個閾值提取出影象中的較亮區域,把它們儲存在一張渲染紋理中,再利用高斯模糊對這張渲染進行模糊處理,模擬光線擴散的效果,最後再將其和原影象進行混合,得到最終的效果。

運動模糊

在這裡插入圖片描述
運動模糊的實現由多種方法。一種實現方法是利用累積快取(accumulation buffer)來混合多張連續的影象。當物體快速移動產生多張影象後,我們取它們之間的平均值作為最後的模糊影象。這種方法對效能的消耗很大,因為想要獲取多張幀影象往往意味著我們需要在同一幀裡渲染多次場景。另一種應用廣泛的方法是建立和使用速度快取

(velocity buffer),這個快取中儲存了各個畫素當前的運動速度,然後利用該值來決定模糊的方向和大小。