Stochastic Light Culling for VPLs on GGX Microsurfaces論文研讀

前言

好久沒寫博客了,今天來共享一下最近研讀的一篇論文吧,文章中[***.pdf]爲參考文獻可自行谷歌學術下載。因爲本人還是個圖形學菜鳥,所以有什麼問題希望大家多多指正。

Stochastic Light Culling for VPLs on GGX Microsurfaces

詞彙解析

VPL

VPL - virtual point light 虛擬點光源

以虛擬的點光源爲間接光提供光照。可以在場景中分佈多個虛擬點光源,對每個點光源的亮度都設置最大限度,這樣就可以模擬在空間中傳播的間接光。核心觀點是,一般的光傳輸問題可以近似爲計算許多虛擬點光源的直接照明的簡單問題。

路徑跟蹤通過從相機開始跟蹤光線來構建路徑。在與場景的每個交點上,通過在交點表面上方的半球上隨機採樣一個出射方向(通常在每個交點上也估計直接光照)來繼續路徑。基於路徑跟蹤,雙向方法跟蹤攝像機子路徑和光子路徑,然後(確定地)將它們連接起來形成完整的路徑。

Instant Radiosity (IR)是一種以特定方式構造這兩組子路徑的雙向方法,如上圖2所示。首先,生成並存儲一組任意長度的光子路徑[問題6]。爲子路徑上的每個頂點(不是路徑上的每個點),會完整地儲存局部環境:位置、法線、入射方向、BRDF和當前“通量”(即發光光源的輻射通量乘以頂點的吞吐量除以該點的路徑的概率密度)。其目的是,爲每個頂點存儲足夠的數據以計算從該頂點向任何方向散射的出射照度。如果按照這種思維,我們可以放棄原始路徑的概念,而將頂點建模爲一種不同尋常的點光源。由於這些不是場景中的物理光源,我們稱之爲虛擬點光源(VPLs)。

爲了完成IR算法,在第二階段爲每個像素構造相機子路徑。因爲光的子路徑是任意長的,所以只考慮長度爲1的攝像機路徑就足夠了。然後,像所有的雙向算法一樣,IR將這些攝像機子路徑的頂點連接到光路徑的頂點,形成完整的路徑。但是,由於VPL的生成是預處理過程,所以這個連接步驟與VPL對第一個攝像機命中點的直接照明相當。

一個基本的VPL照明方法總結如下:

第一階段:生成VPL

    在場景中隨機選擇一個主光源,隨機採樣一個位置x\boldsymbol{\mathbf{x}}和方向ω\boldsymbol{\omega}(如果不處理直接照明,在此位置創建一個VPL)。

    追蹤射線x+tω\boldsymbol{\mathbf{x}} + t\boldsymbol{\omega}。如果它與一個表面相交,那麼在這個相交位置創建一個VPL

    使用俄羅斯輪盤隨機決定是否終止路徑。如果繼續,則採樣輸出方向,基於BRDF和方向更新路徑吞吐量,並繼續跟蹤。

第二階段:使用VPL渲染

    爲一個表面點着色,只需遍歷所有VPL,測試其照明是否被阻擋,如果沒有,計算各自的貢獻。

[Scalable Realistic Rendering with Many-light Methods.pdf]

GGX

GGX是一種更精確的微表面分佈函數,是一種描述微表面法線方向分佈的函數,可對於表面粗糙的半透明物體和表面粗糙的不透明物體均可適用。

https://www.jianshu.com/p/be4f025aeb3c

Caustics

Caustics(光焦散)是由曲面或物體反射或折射的光的聚合,或該光的聚合在另一表面上的投影。光焦散是每條光與之相切的曲線或表面,將光的聚合線的邊界定義爲聚光曲線。因此,在相鄰圖像中,焦散可以是光斑或它們的明亮邊緣。這些形狀通常具有尖銳的奇點。光焦散的常見情形就是水波紋。

https://en.wikipedia.org/wiki/Caustic_(optics)

Helmholtz Reciprocity

Helmholtz互異性:入射角和出射角互換,函數值保持不變。

https://blog.csdn.net/weixin_41036461/article/details/79846176

Lightcuts

Lightcuts(光剪切)是第一種實用的、可擴展的多光源方法。在需要計算光照的每個接收點,Lightcuts會根據分析的每個羣集的誤差範圍和感知指標生成自定義的切割。首先,基於空間和方向相似性,將VPL先組織成二叉樹。要爲接收點選擇一個片段,我們從一個簡單的粗略聚類開始,例如將所有燈光放在一個聚類中。這對應於僅由光樹的根節點組成的剪切。然後,我們迭代地選擇當前剪切中誤差範圍最大的聚類,並對其進行精煉以替換其在光樹中的孩子。重複此過程,直到剪切中所有聚類的誤差範圍低於基於感知的閾值(通常設置爲總數的2%)爲止。剪切的大小通常僅取決於VPL的數量,與完全評估相比,隨着VPL數量的增加,剪切速度會大大提高。使用分析誤差界限還可以確保始終找到並評估最重要的VPL,從而使估算更加可靠。 Davidovic描述了漸進的、對GPU友好的Lightcuts變體。

然而,使用誤差界限也有一些缺點。誤差邊界忽略了遮擋,並且通常過於保守,導致比最優剪切更大。此外,爲新的材質模型開發良好的誤差界限是具有挑戰性和困難的。Lightcuts也沒有利用附近接收點的剪切通常非常相似這一事實,而是爲每個點從頭生成一個剪切。

[Scalable Realistic Rendering with Many-light Methods.pdf]

[Lightcuts A Scalable Approach to Illumination.pdf]

陰影遮罩函數

masking-shadowing function即陰影遮罩函數(也稱爲可見性函數),是描述光線從入射到出射的過程中,有多少比例被微表面自身的凹凸不平遮擋主了。這部分和法線分佈函數很像,依據的是表面的粗糙程度。爲了準確描述,首先需要這樣的一個函數:給一個方向,獲得微表面在這個方向上被自遮擋的面積的比例。

[Geometrical shadowing of a random rough surface.pdf]

[Understanding the masking-shadowing function in microfacet-based BRDFs.pdf]

相關算法

光剔除技術

爲了渲染虛擬點光源,並且限制這些點光源的影響範圍,就需要對其進行光剔除。現在主要有以下幾種光剔除算法:

濺射

splatting技術又稱爲濺射技術,核心思想是把數據場中每個體素看作一個能量源,當每個體素投向圖像平面時,用以體素的投影點爲中心的重建核將體素的能量擴散到圖像像素上。這種方法之所以叫濺射是因爲把能量由中心向四周逐漸擴散的狀態形象地比喻爲濺射的雪,就好像把一個雪球(體素)扔到一個玻璃盤子上,雪球散開以後,在撞擊中心的雪量(對圖像的貢獻)最大,而隨着離撞擊中心距離的增加,雪量(貢獻)減少。

在此論文中提出了一種包圍橢球的方法。

目標是計算一個簡單的有界區域,該區域之外的光照低於閾值。如上圖3所示,對於漫射像素光,這個區域是蛋形的,而對於光滑的表面,其形狀類似於光子葉瓣。注意,這些表面是包含空間衰減的等照度面,而不是發光的極座標圖!

出於實際的原因,我們在這兩種情況下都使用橢球作爲界。對於每個像素的光,我們必須計算橢球參數,並相應地轉換一個球面三角形網格來減少三角形數量。

http://blog.sina.com.cn/s/blog_76373c430100yxjd.html

[Splatting Indirect Illumination.pdf]

分塊剔除

tiled culling技術又稱爲分塊剔除技術,該方法首先是將屏幕分成小塊(比如16*16pixel),每個小塊爲一個視錐體;在每一個視錐體中,根據ZBuffer得到每個Tile的MinZ和MaxZ(depth bounds),用MinZ到MaxZ這片區域對光做交點測試(一般使用compute shader)——點光源只需要position和range,spotlight也用球來做剔除bound;剔除後,每個Tile裏面的光的index寫入list,得到Tile個光源index的list,找出場景中那些對當前Tile有貢獻的光源,然後對每個Tile中的pixel,只需要計算其對應的Tile中light list內的光源對該像素的貢獻;之後進行color pass。

Advancements in Tiled-Based Compute Rendering裏面介紹了兩種剔除方法,一種是視錐體剔除,一種是AABB剔除,AABB剔除結果好一些

https://blog.csdn.net/wolf96/article/details/85541991

http://loongstudio.com/wangkan/?p=1657

[Tiled Shading.pdf]

聚類着色

clustered shading技術又稱爲聚類着色技術,核心思想是給light list的劃分增加了一個維度,即depth(當然也可以再增加normal的維度),它根據view frustum的zmin,zmax把場景進一步根據depth劃分成若干個slice(基於指數的劃分,通常16個),然後在每個slice上對場景中的所有燈光進行light culling,具體的計算方案和tiled based提到的一些方案類似,只是這裏不再需要處理深度不連續的問題。

https://zhuanlan.zhihu.com/p/92165837

[Reflective Shadow Map Clustering for Real-Time Global Illumination.pdf]

交錯採樣

interleaved sampling(即交錯採樣技術)可以用於減少每個像素當中VPL的數量。

原始的交錯採樣

交錯採樣的基本思想非常簡單,而且從圖1中可以立即看出:在累加緩衝區方法中,不規則的採樣模式固定在一個像素上,因此對所有像素週期性地重複採樣,從而具有較高的像素間混疊的可能性(參見圖1a)。對於交錯採樣,選擇覆蓋多個像素的不規則偏移模式。通過週期性地重複這個模式,規則的網格仍然像圖1b中強調的那樣持續存在,但是相鄰的像素被不同的模式採樣。注意,雖然規則網格的數目增加了,但有效地降低了像素間混疊的可能,並且樣本總數保持不變。

[Interleaved Sampling.pdf]

[The Accumulation Buffer: Hardware Support for High-
Quality Rendering.pdf]

交錯樣本模式的非交錯延遲着色

現在,我們使用緩衝區分割/聚合技術來展示延遲着色的擴展。它們被限制爲低分辨率的分塊子緩衝區,而不是在整個G-buffer上執行着色操作。與標準的延遲着色相比,增加了三個通道。第一個將G-buffer分成幾個子緩衝區,第二個在着色階段後重建交錯採樣模式,第三個利用相鄰像素的空間相關性來混合不相關的光照對像素的貢獻。因此,渲染管道現在被分解爲5個步驟,如圖3所示:

創建G-Buffer

在着色操作之前,首先創建三個分別包含位置、法線和顏色的浮點緩衝區(Gbuffer)。材料標識符等材料信息也打包在其餘組件中。由於帶寬的原因,精度被限制在16位,因此場景是有限的。

G-Buffer分割

初始的G-Buffer被分割成單獨的子緩衝區。首先計算兩個查找紋理。第一個存儲分塊函數,第二個存儲塊轉換函數。然後,兩個fragment程序依次執行這兩個函數。完成後,將子緩衝區平鋪到與初始緩衝區大小相同的緩衝區中。

塊拆分:一個簡單的想法是將拆分操作限制在較小的2D塊中,以增強數據局部性。因此,將初始G緩衝區細分爲p * q個塊,並將每個塊拆分爲n * m個單獨的子塊。如果塊足夠小,則在訪問過程中,內存訪問將保持一致。經過此階段後,每個子緩衝區被細分爲p * q個子塊,分佈在整個緩衝區中,如上圖2.c所示。

塊轉換:要重建每個子緩衝區,另一階段將執行交錯的子塊的轉換(請參見圖2.c和2.d)。再次強調,由於整個塊被移動,因此存儲器訪問保持一致。

着色計算

爲每個子緩衝區計算不同光源的貢獻。延遲着色可能進行的任何操作仍然可用。確實,由於以前的G-Buffer被明確地拆分爲較小的子緩衝區,因此任何延遲的着色器也可以通過將視口聚焦或在給定的子緩衝區上繪製四邊形來使用。然後獲得小的輻照度子緩衝區的圖塊(參見圖3.c)。可能會注意到,通過在標準陰影貼圖中展開半立方體(或立方體)並用小立方體貼圖重新索引它,可以解決半球形(或球形)點光源的可見性。根據應用程序的不同,最終可以使用兩種着色技術:SSM(帶陰影貼圖的陰影)是具有陰影貼圖重新投影的陰影傳遞,而SNSM(無陰影貼圖的陰影)是沒有陰影映射的陰影傳遞,陰影貼圖重新投影(可見性被忽略)。在這兩種情況下,都會處理光澤的BRDF和漫反射的BRDF。

緩衝聚合

一旦完成了着色操作,就可以通過聚合子緩衝區來重構交錯模式。此過程與緩衝區拆分過程相反(請參見圖3.d),並且出於相同的原因,它以兩個過程執行,即塊轉換過程和塊聚合過程。

濾波

爲了保證交互性和實時性,每個像素中都值計算很少的光源貢獻。如果將濾波應用於屏幕的連續區域,則可以利用場景的幾何相干性來虛擬計算每個像素中有許多光源的貢獻。

[Non-interleaved deferred shading of interleaved sample patterns.pdf]

主要目標

由於現存的光剔除技術需要限制光源的影響範圍,所以會造成場景明顯偏暗。

本文的方法爲利用GGX微表面生成光滑的單反彈光焦散的實時繪製方法。該方法是基於VPL的隨機光剔除,這是一種無偏差的剔除方法,可以隨機確定每個VPL的光影響範圍,並且是對每個VPL的包圍橢球進行分塊剔除。包圍橢球的計算使用的是一種推導出的簡單分析方法,可以爲GGX微表面上的VPL生成更緊密的邊界橢球。對於成千上萬的VPL時,該方法結合交錯採樣比基於保守光柵化的聚類着色的速度更快(聚類着色法是最新的支持剔除邊界橢球的技術)。

本文主要有如下貢獻:

    將隨機光剔除方法推廣到光滑VPL的方向相關影響範圍。

    從GGX微平面BRDF反射的VPL中解析地推導出光範圍的包圍橢球體。

    本文提出了一種有效的包圍橢球體的分塊剔除算法。

本文的繪製管線如下圖2所示。上訴貢獻在繪製管線中的橙色部分實現了。

算法細節

3 光滑虛擬點光源的隨機光剔除

3.1 隨機光剔除

隨機光剔除算法是通過俄羅斯輪盤確定不重要[問題5]光源的影響範圍來隨機地刪除不重要的光源。對於每一個光源,俄羅斯輪盤通過其在着色點的概率來決定是否剔除這個光源,這個概率與輻射率成正比。對於每一個點光源,其在某個着色點的輻射率如下:

L(ωo,l)=I(ωo)l2 L\left(\boldsymbol{\omega}_{o}, l\right)=\frac{I\left(\boldsymbol{\omega}_{o}\right)}{l^{2}}

其中,I(ωo)I(\boldsymbol{\omega}_{o})表示輻射強度,ωOS2\boldsymbol{\omega}_{O}\in\mathcal{S}^{2}表示從點光源到着色點的方向,l[0,)l\in[0, \infty)表示從點光源到着色點的距離。

在這篇文章中,使用如下的概率函數:

p(ωo,l)=min(I(ωo)δl2,1) p\left(\boldsymbol{\omega}_{o}, l\right)=\min \left(\frac{I\left(\boldsymbol{\omega}_{o}\right)}{\delta l^{2}}, 1\right)

其中δ(0,)\delta \in(0, \infty)是一個用戶自定義的參數(這篇文章用的δ=0.001\delta = 0.001)。

如果某個點沒有被剔除的話(概率超過某個閾值),就會將它的輻射率除以概率值[問題1],如下所示:

L(ωo,l){L(ω0,l)p(ωo,l)(p(ωo,l)>ξ)0( otherwise ) L\left(\boldsymbol{\omega}_{o}, l\right) \approx\left\{\begin{array}{ll} \frac{L\left(\boldsymbol{\omega}_{0}, l\right)}{p\left(\boldsymbol{\omega}_{o}, l\right)} & \left(p\left(\boldsymbol{\omega}_{o}, l\right)>\xi\right) \\ 0 & (\text { otherwise }) \end{array}\right.

其中,ξ[0,1)\xi \in[0,1)是一個統一的隨機數。

隨機光剔除算法中,對每一個光源都使用單個隨機數ξ\xi;並且對於一個給定的光源,所有的着色點都會使用相同的ξ\xi。這樣做的好處就是可以限制每個光源的影響範圍,並且能夠以無偏差的方式時利用現有的剔除方法。

3.2 虛擬點光源的BRDF相關影響範圍

Tokuyoshi爲了使用包圍球和現有的塊剔除方法,但卻忽略了概率函數p(ωo,l)p\left(\boldsymbol{\omega}_{o}, l\right)的方向性。這篇文章考慮了光滑虛擬點光源的方向性,如下圖4所示:

所以,某個VPL的輻射強度計算如下:

I(ωo)=Φf(ωi,ωo)max(ωon,0)I\left(\boldsymbol{\omega}_{o}\right)=\Phi f\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right) \max \left(\boldsymbol{\omega}_{o} \cdot \mathbf{n}, 0\right)

其中Φ\Phi表示光子到達VPL處的輻射通量,f(ωi,ωo)f\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right)是BRDF,ωiS2\boldsymbol{\omega}_{i} \in \mathcal{S}^{2}是光子的入射方向,nS2\mathbf{n} \in \mathcal{S}^{2}是VPL處的幾何法線。因此,上圖4所示的VPL的影響範圍如下:

lmax(ωo)=p1(ξ)=Φf(ωi,ωo)max(ωon,0)δξl_{\max }\left(\boldsymbol{\omega}_{o}\right)=p^{-1}(\xi)=\sqrt{\frac{\Phi f\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right) \max \left(\boldsymbol{\omega}_{o} \cdot \mathbf{n}, 0\right)}{\delta \xi}}

其中lmax(ωo)l_{\max }\left(\boldsymbol{\omega}_{o}\right)是BRDF(f(ωi,ωo)f\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right))所反射的輻射率的等值面。爲了綁定這個等值面,我們使用了與Dachsbacher濺射算法中使用過類似的橢球面。但與之不同的是,我們爲GGX微平面的BRDF引入了包圍橢球。

公式推導如下:


(字醜,見諒)

4 GGX反射的包圍橢球

4.1 GGX微平面的BRDF

建模微平面的BRDF可以用來表示粗糙平面光的反射,BRDF計算如下:

f(ωi,ωo)=F(ωiωh)G2(ωi,ωo)D(ωhn)4ωinωonf\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right)=\frac{F\left(\boldsymbol{\omega}_{i} \cdot \boldsymbol{\omega}_{h}\right) G_{2}\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right) D\left(\boldsymbol{\omega}_{h} \cdot \mathbf{n}\right)}{4\left|\boldsymbol{\omega}_{i} \cdot \mathbf{n} \| \boldsymbol{\omega}_{o} \cdot \mathbf{n}\right|}

其中,ωh=ωi+ωoωi+ωo\boldsymbol{\omega}_{h}=\frac{\boldsymbol{\omega}_{i}+\boldsymbol{\omega}_{o}}{\left\|\boldsymbol{\omega}_{i}+\boldsymbol{\omega}_{o}\right\|}表示半程向量,F(ωiωh)[0,1]F\left(\boldsymbol{\omega}_{i} \cdot \boldsymbol{\omega}_{h}\right) \in[0,1]是菲涅爾因子。

D(ωhn)D\left(\boldsymbol{\omega}_{h} \cdot \mathbf{n}\right)是NDF,表示微平面法線的分佈。在GGX中,NDF是一個鐘形的函數,定義如下:

D(cosθm)=α2χ+(cosθm)π(α2cos2θm+sin2θm)2D\left(\cos \theta_{m}\right)=\frac{\alpha^{2} \chi^{+}\left(\cos \theta_{m}\right)}{\pi\left(\alpha^{2} \cos ^{2} \theta_{m}+\sin ^{2} \theta_{m}\right)^{2}}

其中,α\alpha是粗糙度參數,χ+(cosθm)\chi^{+}(\cos \theta_{m})是海維賽德函數:如果cosθm>0\cos \theta_{m} > 0,則表示1;如果cosθm0\cos \theta_{m} \leq 0,則表示0。本文假定α(0,1]\alpha \in(0,1],這在計算機圖形學的數據壓縮中很常用,並且很容易被藝術家控制。如果α(0,1]\alpha \in(0,1],那麼GGX的NDF在cosθm[0,π/2]\cos \theta_m \in[0,\pi/2]時單調遞減。

G2(ωi,ωo)[0,1]G_{2}\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right) \in[0,1]是陰影遮蔽函數。在本文中,我們使用Smith微平面模型,因爲這個遮蔽函數是可分離的[問題2]:

G1(ωi,ωh)=χ+(ωiωh)G1dist (ωi)G_{1}\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{h}\right)=\chi^{+}\left(\boldsymbol{\omega}_{i} \cdot \boldsymbol{\omega}_{h}\right) G_{1}^{\text {dist }}\left(\boldsymbol{\omega}_{i}\right)

其中,χ+(ωiωh)\chi^{+}(\boldsymbol{\omega}_{i} \cdot \boldsymbol{\omega}_{h})表示的是正面微平面的二元可見性,並且G1dist(ωi)G_{1}^{dist}(\boldsymbol{\omega}_i)ωh\boldsymbol{\omega}_h無關。根據可見法線分佈的約束,G1dist(ωi)G_{1}^{dist}(\boldsymbol{\omega}_i)定義如下:

G1dist (ωi)=ωinS2D(ωn)max(ωiω,0)dω=2ωinωin+(1α2)(ωin)2+α2\begin{aligned} G_{1}^{\text {dist }}\left(\boldsymbol{\omega}_{i}\right) &=\frac{\left|\boldsymbol{\omega}_{i} \cdot \mathbf{n}\right|}{\int_{\mathcal{S}^{2}} D(\boldsymbol{\omega} \cdot \mathbf{n}) \max \left(\boldsymbol{\omega}_{i} \cdot \boldsymbol{\omega}, 0\right) \mathrm{d} \boldsymbol{\omega}} \\ &=\frac{2\left|\boldsymbol{\omega}_{i} \cdot \mathbf{n}\right|}{\left|\boldsymbol{\omega}_{i} \cdot \mathbf{n}\right|+\sqrt{\left(1-\alpha^{2}\right)\left(\boldsymbol{\omega}_{i} \cdot \mathbf{n}\right)^{2}+\alpha^{2}}} \end{aligned}

Smith陰影遮蔽函數有幾種形式(比如高度相關的形式),但任何形式都滿足G2(ωi,ωo)G1dist (ωi)G_{2}\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right) \leq G_{1}^{\text {dist }}\left(\boldsymbol{\omega}_{i}\right)

4.2 包圍橢球

因爲微平面的BRDF是非常複雜的,所以我們考慮使用一個簡化的函數來表示反射波瓣(簡化函數大於等於反射波瓣),定義如下:

f(ωi,ωo)max(ωon,0)Fmax(ωi)G1dist(ωi)D(ωhn)4ωinf\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right) \max \left(\boldsymbol{\omega}_{o} \cdot \mathbf{n}, 0\right) \leq \frac{F_{\max }\left(\boldsymbol{\omega}_{i}\right) G_{1}^{\mathrm{dist}}\left(\boldsymbol{\omega}_{i}\right) D\left(\boldsymbol{\omega}_{h} \cdot \mathbf{n}\right)}{4\left|\boldsymbol{\omega}_{i} \cdot \mathbf{n}\right|}

其中,Fmax(ωi)F_{\max}(\boldsymbol{\omega}_i)是對於ωi\boldsymbol{\omega}_i來說最大的菲涅爾因子。在不等式右邊,與ωo\boldsymbol{\omega}_o有關的就只有NDF的D(ωhn)D(\boldsymbol{\omega}_h \cdot \boldsymbol{n})。當出射方向ωo\boldsymbol{\omega}_o位於以理想鏡面反射方向爲中心的球形圓上時,ωh\boldsymbol{\omega}_h是一個位於半短軸爲θ2\frac{\theta}{2}的球形橢圓上(如下圖5.a和5.b)或半長軸爲θ2\frac{\theta}{2}的球形雙曲線上(如下圖5.c),其中理想鏡面反射方向爲ωu=2(ωin)nωi\boldsymbol{\omega}_{u}=2\left(\boldsymbol{\omega}_{i} \cdot \mathbf{n}\right) \mathbf{n}-\boldsymbol{\omega}_{i},球形圓的半徑爲θ=arccos(ωoωu)\theta=\arccos \left(\boldsymbol{\omega}_{o} \cdot \boldsymbol{\omega}_{u}\right)θ\theta表示出射方向ωo\boldsymbol{\omega}_o與理想鏡面反射方向ωu\boldsymbol{\omega}_u之間的夾角。

因此,我們可以獲得一個在ωh\boldsymbol{\omega}_hn\boldsymbol{n}之間的角度下界[問題3]:

arccos(ωhn)θ2\arccos \left(\boldsymbol{\omega}_{h} \cdot \mathbf{n}\right) \geq \frac{\theta}{2}

當出射方向ωo\boldsymbol{\omega}_o位於經過入射方向ωi\boldsymbol{\omega}_i和法線n\boldsymbol{n}的大圓上時,不等式左右相等。對於α(0,1]\alpha \in(0,1],因爲GGX的NDF是單調遞減的,根據上式就有:

D(ωhn)D(cosθ2)D\left(\boldsymbol{\omega}_{h} \cdot \mathbf{n}\right) \leq D\left(\cos \frac{\theta}{2}\right)

因此,基於GGX的光滑反射的等值面就被如下的面s(ωo)s(\boldsymbol{\omega}_o)所包圍:

lmax(ωo)s(ωo)=ΦFmax(ωi)G1dist (ωi)D(cosθ2)4δξωin=rπD(cosθ2)\begin{aligned} l_{\max }\left(\boldsymbol{\omega}_{o}\right) \leq s\left(\boldsymbol{\omega}_{o}\right) &=\sqrt{\frac{\Phi F_{\max }\left(\boldsymbol{\omega}_{i}\right) G_{1}^{\text {dist }}\left(\boldsymbol{\omega}_{i}\right) D\left(\cos \frac{\theta}{2}\right)}{4 \delta \xi\left|\boldsymbol{\omega}_{i} \cdot \mathbf{n}\right|}} \\ &=r \sqrt{\pi D\left(\cos \frac{\theta}{2}\right)} \end{aligned}

其中,r=ΦFmax(ωi)G1dist (ωi)4πδξωinr=\sqrt{\frac{\Phi F_{\max }\left(\boldsymbol{\omega}_{i}\right) G_{1}^{\text {dist }}\left(\boldsymbol{\omega}_{i}\right)}{4 \pi \delta \xi\left|\boldsymbol{\omega}_{i} \cdot \mathbf{n}\right|}}。意外的是,這個平面s(ωo)s(\boldsymbol{\omega}_o)是一個橢球體,如下圖6所示(推導見附錄A)。

這個橢球體的半軸是(α\alpha表示粗糙度參數):

(ru,rv,rw)=(1+α22αr,r,r)\left(r_{u}, r_{v}, r_{w}\right)=\left(\frac{1+\alpha^{2}}{2 \alpha} r, r, r\right)

這個橢球體的旋轉矩陣是:

R=[ωuωw×ωuωw]\mathbf{R}=\left[\begin{array}{lll} \boldsymbol{\omega}_{u} & \boldsymbol{\omega}_{w} \times \boldsymbol{\omega}_{u} & \boldsymbol{\omega}_{w} \end{array}\right]

其中,ωwS2\boldsymbol{\omega}_w \in\mathcal{S}^{2}是一個單位向量,且與ωu\boldsymbol{\omega}_un\boldsymbol{n}正交(也就是,ωw=ωu×nωu×n\boldsymbol{\omega}_{w}=\frac{\boldsymbol{\omega}_{u} \times \boldsymbol{n}}{\|\boldsymbol{\omega}_{u} \times \boldsymbol{n}\|},當ωun\boldsymbol{\omega}_u \neq \boldsymbol{n})。

這個橢球體的中心是:

c=q+1α22αrωu\mathbf{c}=\mathbf{q}+\frac{1-\alpha^{2}}{2 \alpha} r \omega_{u}

其中,qR3\mathbf{q} \in \mathbb{R}^{3}是VPL的位置。

5 使用包圍橢球的分塊剔除

儘管基於光柵化的剔除方法支持包圍橢球,但本文擴展基於計算的分塊剔除方法來使用包圍橢球。這種基於計算的剔除方法比基於光柵化的剔除方法更高效、代價更低,因爲對於成千上萬的光源來說,隨機光剔除是與交錯採樣結合使用的。這種擴展在數學上是微不足道的,但是它的計算代價卻高於包圍球。因此,本文引入了一個優化的方法。

5.1 橢球-截椎體的相交測試

在視圖空間中,對於每一個分塊,分塊剔除都會執行包圍體和截椎體的粗略的相交測試(如下圖7.a)。

這個視圖空間的橢球體使用一個旋轉矩陣R^=VR\hat{\mathbf{R}}=\mathbf{V R}和一箇中心位置c^=Vc+o\hat{\mathbf{c}}=\mathbf{V} \mathbf{c}+\boldsymbol{o}來表示,其中,3x3的矩陣V\mathbf{V}表示從世界空間到視圖空間的旋轉,oR3\boldsymbol{o} \in \mathbb{R}^{3}表示從世界空間到視圖空間的平移。該橢球體與截錐體的相交測試可等價地表示爲球面與截錐體的相交測試,其方法是利用以下變換矩陣對空間進行拉伸:

S=R^[1ru0001rv0001rw]R^T\mathbf{S}=\mathbf{\hat{R}}\left[\begin{array}{ccc} \frac{1}{r_{u}} & 0 & 0 \\ 0 & \frac{1}{r_{v}} & 0 \\ 0 & 0 & \frac{1}{r_{w}} \end{array}\right] \mathbf{\hat{R}}^{T}

使用這個變換矩陣,每一個包圍橢球體都會被拉伸到單位球(如圖7.b)。因此,通過變換每一個光源的測試空間,我們能夠對包圍橢球做一些修改就可以重用現有的基於包圍球的剔除方法。本文采用了Modified HalfZ剔除法,這個方法使用兩個深度聚類和一個截椎體的軸對齊包圍盒(AABB)來對包圍球-截椎體進行粗糙的相交測試。

5.1.1 Modified HalfZ剔除法

圖1.4顯示了一個分塊包圍體的2D表示。如圖1.4(a)所示,背景物體前面的前景物體會導致分塊包圍體的深度範圍變大。光源可以位於前景和背景之間的空白空間,這樣可以通過相交測試,但實際上不影響任何分塊中的任何像素。也就是說,深度不連續會導致假陽性交點的增加。

圖1.4(b)顯示了稱爲Half Z方法,它是可以更好地處理深度不連續的策略。它只是在中點將深度範圍劃分爲兩個,並根據兩個深度範圍進行篩選:一個是從最小Z到半Z,另一個是從半Z到最大Z。並且逐塊爲每個深度範圍維護一個單獨的列表,該方法只需要兩個額外的平面測試。

圖1.4©顯示了第二種策略,稱爲Modified HalfZ方法。它執行附加的原子操作以在最小Z和半Z之間找到第二個最大值(最大值Z2),在最小Z和半Z之間找到第二個最小值(最小Z2)。相比Half Z方法,這樣可以形成更緊密的包圍體,但是,由於需要額外的原子操作,計算附加的最小值和最大值比簡單地計算半Z要昂貴得多。

5.2 通過旋轉測試空間來加速

對於代碼優化,大多數現有的剔除方法實現都假定了截椎體的深度平面是與z軸垂直的。然而,我們的拉伸變換卻打破了這個假設。這就增加了相交測試的AABB計算的代碼複雜度。另外,由於拉伸後的截椎體與AABB的不匹配(如圖7.b),就會捕獲很多的誤報。爲了緩和這些問題,本文使用如下的旋轉矩陣對測試空間進行額外的旋轉:

B={[bxbxbz×bxbz×bxbzbz]T(bx>by)[by×bzby×bzbyby.bzbz]T (otherwise) \mathbf{B}=\left\{\begin{array}{ll} {\left[\frac{\mathbf{b}_{x}}{\left\|\mathbf{b}_{x}\right\|} \quad \frac{\mathbf{b}_{z} \times \mathbf{b}_{x}}{\left\|\mathbf{b}_{z} \times \mathbf{b}_{x}\right\|}\right.} & \left.\frac{\mathbf{b}_{z}}{\left\|\mathbf{b}_{z}\right\|}\right]^{\mathrm{T}} \quad\left(\left\|\mathbf{b}_{x}\right\|>\left\|\mathbf{b}_{y}\right\|\right) \\ {\left[\frac{\mathbf{b}_{y} \times \mathbf{b}_{z}}{\left\|\mathbf{b}_{y} \times \mathbf{b}_{z}\right\|} \quad \frac{\mathbf{b}_{y}}{\left\|\mathbf{b}_{y}\right\|}\right.} & .\left.\frac{\mathbf{b}_{z}}{\left\|\mathbf{b}_{z}\right\|}\right]^{\mathrm{T}} \quad \text { (otherwise) } \end{array}\right.

其中,bx=S[100]T\mathbf{b}_{x}=\mathbf{S}\left[\begin{array}{lll}1 & 0 & 0\end{array}\right]^{\mathrm{T}}by=S[010]T\mathbf{b}_{y}=\mathbf{S}\left[\begin{array}{lll}0 & 1 & 0\end{array}\right]^{\mathrm{T}},並且bz=bx×by\mathbf{b}_{z}=\mathbf{b}_{x} \times \mathbf{b}_{y}。旋轉矩陣B\mathbf{B}用於使變換後的截椎體的深度平面與z軸保持垂直(如圖7.c)。這就能讓我們簡化AABB的計算代碼,並且計算一個對剪切後的截錐體包裹更緊密的AABB。在本文中,每一個光源的矩陣BS\mathbf{BS}和位置BSc^\mathbf{BS\hat{c}}被計算後都會存儲到內存當中。然後,在光剔除階段的橢球體-截錐體相交測試時,都會加載這些BS\mathbf{BS}BSc^\mathbf{BS\hat{c}}

實現細節

交錯採樣

除了隨機光剔除,本文使用了對GPU友好的交錯採樣技術來減少每個像素中VPL的數量(如下圖8所示)。首先,該技術將規則採樣模式中的像素去交錯到屏幕的子區域中。然後,對於每一個子區域,使用不同的VPL的子集來進行着色。比如,對65536個VPL使用8x8的交錯採樣,每一個子區域的VPL數量就會減少到1024個。在本文中,我們的隨機光剔除在每個子區域中都會執行。所以,這種交錯採樣技術不僅減少了着色的時間,還減少了剔除的時間。我們基於分塊延遲着色的方法在單通道下實現了這個算法交錯樣本模式的非交錯延遲着色。儘管方差在渲染的圖像中可見爲噪聲,但是在後期處理中使用交叉雙邊濾波器可以消除此噪聲。

漫反射VPL

儘管包圍橢球也可以用於漫反射VPL,這個形狀(由Dachsbacher導出的)幾乎是一個球體。因此,對於漫反射VPL,我們使用的是包圍球,其半徑等於橢球的最長半軸。在本文中,包圍球的中心點位置和半徑分別由q+(13)34Φkπδξn\mathbf{q}+\left(\frac{1}{3}\right)^{\frac{3}{4}} \sqrt{\frac{\Phi k}{\pi \delta \xi}} \mathbf{n}(427)14Φkπδξ\left(\frac{4}{27}\right)^{\frac{1}{4}} \sqrt{\frac{\Phi k}{\pi \delta \xi}}隨機給定,其中,k是漫反射係數。

不足和改進

高度鏡面的表面

儘管我們的方法通過每一個VPL的貢獻來剔除VPL,但渲染的質量會受到剔除前VPL密度的限制,類似於lightcuts。因此,對於高頻的BRDF有必要生成更多的VPL(如下圖11所示)。對於這種大量VPL的情況來說,着色之前的剔除階段將會是瓶頸。另外,後處理的去噪會模糊細節處的光焦散。我們的方法不能渲染由完美鏡面反射的光焦散(即α=0\alpha = 0時)。

光滑對光滑的相互反射

儘管本文提高了光滑VPL的採樣的效率,但由於採樣概率的問題,仍然忽略了着色點處的BRDF。如果着色點處是高度鏡面的BRDF(如下圖12所示),這個限制會造成顯著的差異(即噪聲)。在實際中,對於漫反射對光滑和光滑對光滑的相互反射,應該使用有偏差的近似方法(如屏幕空間的反射,screen-space reflection),而不是我們的方法。考慮到光滑對光滑的相互反射,未來的研究可能會研究一種無偏差的剔除方法。

各向異性反射瓣

對於由入射方向ωi\boldsymbol{\omega}_i和法線n\boldsymbol{n}定義的平面來說,我們的包圍橢球體可以很好地擬合。另一方面,對於方向ωw\boldsymbol{\omega}_w(與這個平面正交)來說,包圍橢球會非常鬆弛。這是因爲微平面BRDF模型的反射瓣對於掠射入射方向(a grazing incoming direction[問題4])是各向異性的。因此,可能要減少半軸rwr_w的空間。此外,我們的包圍橢球體沒有考慮NDF的各向異性。儘管對於一個各向異性的NDF,包圍橢球體可以通過最大的粗糙度來計算,但是這樣會形成一個鬆弛的包圍體。根據這種各向異性的反射來縮小包圍橢球體也是我們未來的工作。

問題

問題1

如果用輻射率除以概率值的話,不就增強了光源的輻射率了嗎?(概率值小於等於1)。這樣是否會違背能量守恆定理?且分別將L(ωo,l)L\left(\boldsymbol{\omega}_{o}, l\right)p(ωo,l)p\left(\boldsymbol{\omega}_{o}, l\right)帶入後計算得出的L(ωo,l)δL(\boldsymbol{\omega}_{o}, l) \approx\delta

a: 1、除以概率值是爲了補償被輪盤截斷的光強;2、見上面公式推導

問題2

這個可分離是怎麼分離的:G1G_1G2G_2有什麼關係,或者怎麼將G1G_1用於GGX的BRDF?

a:詳見陰影遮罩函數解析。

問題3

爲什麼是下界呢?

a:因爲ωo\boldsymbol{\omega}_oωu\boldsymbol{\omega}_u之間的夾角爲θ\theta,所以當ωi\boldsymbol{\omega}_iωo\boldsymbol{\omega}_oωu\boldsymbol{\omega}_u三者共面的時候,ωh\boldsymbol{\omega}_hnn之間的夾角最小(爲θ2\frac{\theta}{2});當ωo\boldsymbol{\omega}_oωi\boldsymbol{\omega}_iωu\boldsymbol{\omega}_u不共面時,ωh\boldsymbol{\omega}_hnn之間的夾角就大於三者共面時的θ2\frac{\theta}{2},所以θ2\frac{\theta}{2}就是下界。

思維錯誤原因:以前認爲θ\theta是一個固定值,所以ωh\boldsymbol{\omega}_hnn之間的夾角最小值是能夠爲0的,因此ωh\boldsymbol{\omega}_hnn之間的夾角肯定是可以小於這個固定值的。但是事實上θ\theta是由ωo\boldsymbol{\omega}_oωu\boldsymbol{\omega}_u確定的,其是一個可變量。但一旦確定了ωo\boldsymbol{\omega}_oωu\boldsymbol{\omega}_u的方向,θ\theta也就確定了,這個時候ωh\boldsymbol{\omega}_h的方向也就確定了,但是由於ωo\boldsymbol{\omega}_o可以在球形圓上的任意位置,所以ωh\boldsymbol{\omega}_hnn之間的夾角大小是處在一個範圍內的,這個下界就是這個範圍的最小值。

問題4

a grazing incoming direction是啥?

a: 掠射入射角。光從一種介質向另一種介質傳播,入射角接近於90度時稱之爲掠射。注意:一定要從光疏介質(折射率小)向光密介質(折射率大),入射角一定要極其接近於90°。入射角爲90°(事實上略小於90°,但在計算時完全可以按90°算)

問題5

這個重要性是怎麼判斷的?

a: 概率是取1與輻射率採樣的較小值,如果某個VPL對該着色點來說重要的話,概率值就爲1;如果不重要,就小於1。

問題6

這些信息怎麼儲存,2D紋理或者立方體紋理都不足夠吧?使用3D紋理儲存,還是直接保存在OpenGL緩衝中然後直接傳給繪製?

a: 應該不是是用紋理存儲,類似普通數組的存儲方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章