Bloom實現及其數學分析
Bloom原理
本文主要參考 https://catlikecoding.com/unity/tutorials/advanced-rendering/bloom/
This is somewhat analogous to how our eyes adapt to deal with bright scenes,
Bloom效果是
在遊戲中的Bloom的流程如圖所示
Blur流程詳解
參考[2],圓對稱的2d高斯核是可以線性分解的,高斯核可以被分解為水平卷積和一個豎直卷積。這可以極大的減少計算量,從 nxn 減少為 2xn。
為了生成一個2d的對稱卷積,對於所有的
(
x
,
y
)
(x,y)
(x,y)必須滿足
f
(
x
2
+
y
2
)
×
f
(
0
)
=
f
(
x
)
×
f
(
y
)
f(\sqrt{x^2+y^2}) \times f(0) = f(x) \times f(y)
f(x2+y2)×f(0)=f(x)×f(y),如果假設
f
(
0
)
=
1
f(0)=1
f(0)=1,那麼對稱卷積限制就會變成
f
(
x
2
+
y
2
)
=
f
(
x
)
×
f
(
y
)
f(\sqrt{x^2+y^2}) = f(x) \times f(y)
f(x2+y2)=f(x)×f(y)。
我們分開考慮複核函式的振幅和相位。其中振幅條件是
∣
f
(
x
2
+
y
2
)
∣
=
∣
f
(
x
)
×
f
(
y
)
∣
=
∣
f
(
x
)
∣
×
∣
f
(
y
)
∣
|f(\sqrt{x^2+y^2})|=|f(x) \times f(y)| = |f(x)| \times |f(y)|
∣f(x2+y2)∣=∣f(x)×f(y)∣=∣f(x)∣×∣f(y)∣,這意味著核函式必須使用高斯函式作為其幅度函式。在複數相乘中,相位其實是相加的,相位必須滿足
θ
(
x
2
+
y
2
)
=
θ
(
x
)
+
θ
(
y
)
\theta(\sqrt{x^2+y^2})=\theta(x)+\theta(y)
θ(x2+y2)=θ(x)+θ(y)。而唯一滿足此條件的函式族是
θ
(
x
)
=
a
x
2
\theta(x)=ax^2
θ(x)=ax2。所以以
x
2
x^2
x2為引數的復相位和實高斯函式的乘積可以構成滿足條件的核函式。
1維條件下的核函式的形式是
e
−
a
x
2
e
i
b
x
2
=
e
−
a
x
2
+
i
b
x
2
=
e
(
−
a
+
b
i
)
x
2
e^{-ax^2}e^{ibx^2}=e^{-ax^2+ibx^2}=e^{(-a+bi)x^2}
e−ax2eibx2=e−ax2+ibx2=e(−a+bi)x2,二維形式則是他們的乘積。
根據[2]的方法,他們實現了高效的二維圓對稱低通濾波器[3],這裡就跟球諧分析是互通的了。
根據Bloom流程圖,先要對RT進行模糊,不直接使用最終模糊圖的原因是它會產生均勻的斑點。相反,較低的模糊應該對較高的模糊產生更多的影響。而我們可以通過對中間結果進行積分實現這點,在UpSample的時候把老的結果加上來。
Blur過程本來就是低通濾波的過程,而[4]中解釋DownSample再Upsample其實只是安全的選擇,因為要控制下采樣丟失的資訊。同時對實時計算也更友好,它可以減少取樣的計算量。相比於直接擴大核函式,多次DownSample然後再UpSample的組合其實是類似的效果。但是計算量卻大大減少。
對於每次都將上次DownSampleing的結果與UpSampling的相同大小的紋理相加,相當於是把一個分佈與被用一個低通濾波器處理過的分佈相加,相加的結果分佈中低頻部分得到突出,高頻部分也只是有小的增加,而這次的輸出結果再作為下次UpSample的輸入之一。
整體流程就是突出低頻資訊,保持了高頻資訊,理論上最終的結果就是整體影像高光的部分模糊發亮,但是細節卻還保留了。
由於我們前面提到的高斯函式滿足圓堆成的性質,所有這些DownSample和UpSample的步驟都是可以拆開來做,又是把原來nxn的計算簡化為了2xn的計算。
引用
[1] https://catlikecoding.com/unity/tutorials/advanced-rendering/bloom/
相關文章
- 浮點數表示及其實現.
- c++實現求眾數及其重數C++
- 主成分分析及其matlab實現Matlab
- 社會網路分析及其Python實現Python
- leveldb原始碼分析(2)-bloom filter原始碼OOMFilter
- BlockingQueue介面及其實現類的原始碼分析BloC原始碼
- 布隆過濾器(Bloom Filter)的java實現過濾器OOMFilterJava
- 中臺風險分析-數學期望的現實意義
- LetNet、Alex、VggNet分析及其pytorch實現PyTorch
- WebGL學習之HDR與BloomWebOOM
- 資料結構分析及其實現(Stack、Queue、Tree、LinkedList)資料結構
- Java 併發包中的讀寫鎖及其實現分析Java
- co原始碼分析及其實踐原始碼
- 學習筆記----快速排序的java實現及其改良筆記排序Java
- 字首樹及其Java實現Java
- AOP如何實現及其原理
- Set介面及其實現類
- 線性表及其實現
- 分散式鎖及其實現分散式
- 【筆記】堆及其實現筆記
- uboot環境變數實現分析boot變數
- 數學分析
- 入侵檢測系統分析及其在Linux下的實現(轉)Linux
- 字典樹及其C++實現C++
- 快速傅立葉變換及其實現
- 設計模式學習筆記(二十)狀態模式及其實現設計模式筆記
- 麥卡錫用數學實現了LispLisp
- 短址(short URL)原理及其實現
- List介面及其主要實現類
- 並查集的使用及其實現並查集
- 設計模式學習筆記(十八)備忘錄模式及其實現設計模式筆記
- 離散數學及其應用 (第2版)
- 數學一|概統|二、隨機變數及其分佈隨機變數
- 原生 JS 實現 HTML 轉 Markdown,以及其實現邏輯JSHTML
- 深入理解Vue的watch實現原理及其實現方式Vue
- 輔導高等數學、微積分、數學分析
- 阿里雲PolarDB及其共享儲存PolarFS技術實現分析(上)阿里
- 阿里雲PolarDB及其共享儲存PolarFS技術實現分析(下)阿里