1. 程式人生 > >Unity shader學習之屏幕後期處理效果之高斯模糊

Unity shader學習之屏幕後期處理效果之高斯模糊

歸一化 length spl 學習 baidu 一個 one ogr stat

高斯模糊,見 百度百科。

也使用卷積來實現,每個卷積元素的公式為:技術分享

其中б是標準方差,一般取值為1。

x和y分別對應當前位置到卷積中心的整數距離。

由於需要對高斯核中的權重進行歸一化,即使所有權重相加為1,因此e前面的系數實際不會對結果產生任何影響。

綜上,公式簡化為:

G(x,y) = e-(x*x+y*y)/2

一個5 * 5的高斯核計算代碼如下:

技術分享
 1 using System;
 2 
 3 namespace TestShell
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
8 { 9 double[,] r = CalcGaussianBlur(5); 10 for (int i = 0; i < r.GetLongLength(0); i++) 11 { 12 for (int j = 0; j < r.GetLongLength(1); j++) 13 { 14 Console.Write("{0:f4}\t", r[i, j]); 15 }
16 Console.WriteLine(); 17 } 18 Console.ReadKey(); 19 } 20 21 static double[,] CalcGaussianBlur(int size) 22 { 23 double[,] r = new double[size, size]; 24 int center = (int)Math.Floor(size / 2f); 25 double
sum = 0; 26 27 for (int i = 0; i < size; i++) 28 { 29 for (int j = 0; j < size; j++) 30 { 31 int x = Math.Abs(i - center); 32 int y = Math.Abs(j - center); 33 double d = CalcItem(x, y); 34 r[i, j] = d; 35 sum += d; 36 } 37 } 38 39 for (int i = 0; i < size; i++) 40 { 41 for (int j = 0; j < size; j++) 42 { 43 r[i, j] /= sum; 44 } 45 } 46 47 return r; 48 } 49 50 static double CalcItem(int x, int y) 51 { 52 return Math.Pow(Math.E, -(x * x + y * y) / 2d); 53 } 54 } 55 }
View Code

結果如下:

技術分享

Unity shader學習之屏幕後期處理效果之高斯模糊