高斯模糊是影象模糊處理中非常經典和常見的一種演算法,也是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...