安徽理工大學 姚曄
全局光照一直是渲染領域中非常重要的一環,這種技術的引入可以使實時渲染畫面更加的逼真,可是其對于計算資源的要求非常高。交錯采樣延遲渲染的核心思想是分塊重組Gbuffer中的紋理,通過對應位置的組合由原畫面像素構成的多個小場景,讓每個小場景都獨立計算均分的虛擬點光源下的光照計算,計算完成后將像素還原到原畫面中。通過這種方法,可以較好的降低計算復雜度。基于Canny邊緣檢測算法的高斯濾波器能夠較好的識別圖像邊緣,在交錯采樣合并小場景后可以較好的將像素上的光照分到周圍像素上去,抑制了畫面上的網格效果和亮點。
延遲渲染就是將光照/渲染計算推遲到第二步進行計算,片段著色器和頂點著色器不在第一個渲染Pass中進行著色操作,著色這一步被延遲到第二個渲染通道中執行了。其中,第一次渲染僅將紋理坐標、法線向量、位置坐標、反射系數等簡單幾何信息存儲在緩存中,稱之為Gbuffer。
延遲渲染的最大優點是讓每一次光照計算都變成有效計算,因為在延遲渲染的第一個通道可以獲取整張畫面中能被看見的所有像素的幾何信息,這樣在第二個通道進行著色的時候,所有的光照計算都是有效的,避免了計算資源的浪費。此外,在增加新的光源時,也不需要改動材質Shader,而材質Shader也不需要產生光照,節省了指令數。
交錯采樣延遲渲染是在延遲渲染基礎上的光照計算加速算法。它具有傳統延遲渲染的優勢,通過第一個Pass獲取的幾何信息,可以避免對不可見部分的著色計算。
相比較傳統的延遲渲染,交錯采樣延遲渲染的主要差異在光照計算部分。在該方法下,需要將Gbuffer中的紋理進行分塊重組,通過對應位置的組合由原畫面像素構成的多個小場景,讓每個小場景都獨立計算均分的虛擬點光源下的光照計算,計算完成后將像素還原到原畫面中。
首先需要在Gbuffer中對紋理進行分塊重組。若要對場景進行4×4分塊,即把大場景像素按照16個小塊為一組均分,其中每行每列各4個。如圖1所示,框中為4×4像素組。

圖1 分塊示意圖Fig.1 Schematic diagram of partitioning
分塊后,再用公式(1)和公式(2)將每組中同位置的像素按順序重新組合成16個相似的小場景,如圖2所示。

圖2 重組示意圖Fig.2 Schematic diagram of recombination
圖2中的16個小場景是由原畫面中完全不相同的像素構成的,但是看起來會十分相似。分塊公式如式(1)、式(2)所示:

width
,height
為小塊的寬度和長度,numX
,numY
是分塊的數量,x
,y
是原始像素的位置。分塊重組得到右圖后,開始對每個小場景進行獨立的光照計算。計算光照和傳統的計算一樣,在實時渲染中,有光照方程,如式(3)所示:

L
為輸出光照,L
為直接光照,f
為BRDF項,V
為能見度。在交錯采樣中,將VPL均勻的分給分塊后的每一個小場景。因為將VPL均分,所以在最后計算光照的結果時,需要乘以分塊數的倍數。否則用均分的亮度計算出的結果會為原本的結果的1/16。當然,這樣得出的結果是不夠準確的,所以在間接光照上應用該方法。
組合就是分塊的逆過程,可以通過公式(4)和公式(5)將小場景中的像素恢復回大場景。公式如下:

width
,height
為小塊的寬度和長度,numX
、numY
是分塊X
、Y
方向的數量,x
,y
是像素的位置。組合后,還需要對畫面進行高斯模糊,來減少目前畫面會出現的亮點和網格效果。使用高斯濾波器來消除畫面的網格效果和亮點,首先就需要一個邊緣檢測算法,這樣在進行高斯模糊的時候,就能夠更好的保留畫面中的清晰邊緣。特別是在進行多次高斯模糊后,隨著畫面亮點減少和網格效果減少,如果沒有邊緣檢測算法,畫面會有較強的失真。引入邊緣檢測算法后邊緣的效果會更好。
引入邊緣檢測是為了在高斯模糊前檢測到邊緣信息,從而讓高斯模糊效果在邊緣前停止。目前常見的邊緣檢測算法有Canny算子和LOG算子。倆算子相比優劣情況如表1所示。相同的尺度下LOG算子的邊緣檢測所檢測到的邊緣細節要更多,但是其抗噪效果較差,故采用抗噪效果更好的Canny算子邊緣檢測算法。

表1 Canny算子和LOG算子優劣比較Tab.1 The comparison between Canny operator and LOG operator
Canny邊緣檢測的步驟大致如下:
(1)通過高斯濾波來得到平滑后的圖像。盡量消除圖像中噪聲的影響,并盡可能保存邊緣細節。
(2)計算梯度的幅值和方向,使用Sobel算子來計算像素梯度。
(3)采用非極大值像素梯度抑制,這樣可以消除邊緣檢測帶來的雜散響應。
(4)利用雙閾值的算法,判斷邊緣點。定義高低閾值,不斷調整來獲得準確的邊緣效果。
(5)孤立弱邊緣抑制,查看弱邊緣像素以及周圍的8個領域像素,若其中有一個像素為強邊緣像素,則保留該弱邊緣為強邊緣,也就是真邊緣點。
高斯模糊是通過正態分布,讓每個像素的權值根據像素點到中心距離的不同而變化。二維高斯模型如公式(6)所示:

高斯模糊是通過高斯濾波達成的。低通的高斯濾波就是模糊,而高通的高斯濾波則是銳化。高斯模糊在交錯采樣的延遲渲染中非常重要,在使用一個像素去替代周圍的光照時,會將所有光照結果集中到一個像素之中,這樣周圍本應收到光照的像素則沒有被計算影響。通過高斯模糊,可以將單個像素上的光照結果像周圍像素分散,以達到更好的畫面效果。同時,通過高斯模糊,可以降低圖像的細節層次,特別是減少分塊重組后畫面的網格效果。
最后要對圖像進行高斯模糊,為了防止紋理也被模糊,所以在計算光照時紋理不包含在內,計算完之后再進行融合,結果如圖3所示。

圖3 使用Canny邊緣檢測的高斯模糊實驗結果圖Fig.3 Result of Gaussian blur based on Canny edge detection
而未使用Canny邊緣檢測的高斯模糊后結果如圖4所示。

圖4 未使用Canny邊緣檢測的高斯模糊實驗結果圖Fig.4 Result of Gaussian blur not based on Canny edge detection
可以看到,使用了Canny邊緣檢測的高斯模糊后,畫面的邊緣更加清晰。
本文在交錯采樣延遲渲染的基礎上使用了Canny邊緣檢測的高斯模糊。在計算時間上相較傳統延遲渲染減少了numX
×numY
倍,效率較為優秀。引入Canny邊緣檢測的高斯模糊后,邊緣更加清晰。畫面中仍然有網格現象,通過多次高斯模糊后會有改善。