Bloom實現及其數學分析

滑稽樹發表於2020-12-28

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} eax2eibx2=eax2+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/

[2]http://yehar.com/blog/?p=1495

[3]https://dsp.stackexchange.com/questions/58449/efficient-implementation-of-2-d-circularly-symmetric-low-pass-filter/58634#58634

[4]https://dsp.stackexchange.com/questions/52721/why-should-an-image-be-blurred-using-a-gaussian-kernel-before-downsampling

相關文章