Unity Shader 螢幕後效果 高斯模糊

2022-02-03 04:38:10 字數 2553 閱讀 7141

高斯模糊是影象模糊處理中非常經典和常見的一種演算法,也是bloom螢幕效果的基礎。

實現高斯模糊同樣用到了卷積的概念,關於卷積的概念和原理詳見我的另一篇部落格:

通過高斯方程計算出的卷積核稱為高斯核,乙個5*5的高斯核對它進行權重歸一化如下:

0.0030

0.0133

0.0219

0.0133

0.0030

0.0133

0.0596

0.0983

0.0596

0.0133

0.0219

0.0983

0.1621

0.0983

0.0219

0.0133

0.0596

0.0983

0.0596

0.0133

0.0030

0.0133

0.0219

0.0133

0.0030

通過表也可以很清楚的看到,離原點越近的點模糊程度影響越大,反之越小。

為了優化計算,可以將這個5*5矩陣簡化為兩個矩陣分別計算,得到的效果是相同的。

它們分別是乙個1*5的橫向矩陣和乙個5*1的縱向矩陣,這樣我們只需要對橫縱向矩陣分別進行一次取樣既可,這樣可以很大程度的減少計算量。

拆分之後結果如下:

我們發現,最終的計算只需要記錄3個權重值既可,它們是weight[3]=;

具體實現:

1.實現調整高斯模糊引數的指令碼。

為了進一步優化計算,這裡加入了降取樣係數,模糊範圍縮放;為此,需要在外部增加模糊取樣的迭代次數,具體如下:

1

using

unityengine;23

public

class

gaussianblurctrl : screeneffectbase441

graphics.blit(buffer0, destination);

42rendertexture.releasetemporary(buffer0);43}

44else

45graphics.blit(source, destination);46}

47 }

基類指令碼見:

2.在shader中分別進行橫向和縱向的模糊計算,分為兩個pass進行,具體如下:

1 shader "

myunlit/gaussianblur"2

6}7subshader810

11//

cginclude中的**可被其他pass重複呼叫,用於簡化不必要的重複**

12cginclude

1314

#pragma multi_compile_fog

15 #include "

unitycg.cginc"16

17struct18;

2223

struct

v2f24;29

30sampler2d _maintex;

31float4 _maintex_texelsize;

32float

_blursize;

3334

//用於計算縱向模糊的紋理座標元素

3536

5253

//用於計算橫向模糊的紋理座標元素

5455

7071

//在片元著色器中進行最終的模糊計算,此過程在每個pass中都會進行一次計算,但計算方式是統一的

72fixed4 frag(v2f i) : sv_target73;

7576 fixed4 col = tex2d(_maintex, i.uv[0

]);77

78 fixed3 sum = col.rgb*weights[0

];79

80//

對取樣結果進行對應紋理偏移座標的權重計算,以得到模糊的效果

81for (int it = 1; it < 3; it++)

8286 fixed4 color = fixed4(sum, 1.0

);87

88return

color;89}

9091

endcg

9293

ztest always

94cull off

95zwrite off

9697

//縱向模糊pass,直接用指令呼叫上面的函式

98pass

99107

108//

橫向模糊pass

109pass

110118

}119

fallback off

120 }

效果如下:

Unity Shader 螢幕後效果 邊緣檢測

關於螢幕後效果的控制類詳細見之前寫的另一篇部落格 這篇主要是基於之前的控制類,實現另一種常見的螢幕後效果 邊緣檢測。概念和原理部分 首先,我們需要知道在圖形學中經常處理畫素的一種操作 卷積。卷積操作的實質在於,對於影象中的每個畫素與其周圍的畫素進行的重新融合計算行為,以得到不同的畫素處理效果,例如銳...

Unity Shader 螢幕抓取,螢幕座標

抓取螢幕,抓取後名字為name 獲取螢幕座標有3種方法 sv position語義的xy 使用sv position語義,在片元著色器中拿到的pos.xy就是螢幕空間的座標。struct v2f vpos語義 vpos語義和sv position衝突,使用vpos語義,則v2f不能定義sv posi...

螢幕後處理

void onrenderimage rendertexture src,rendertexture dest 螢幕後處理函式 graphics.blit src,dest,mat,pass 螢幕後處理 src當前螢幕紋理 graphics.drawmesh amesh,vector3.zero,q...