張宏偉
(四川大學視覺合成圖形圖像技術國防重點學科實驗室,成都 610065)
隨著計算機圖形圖像技術的普及,人們對計算機生成圖形的逼真性要求越來越高,計算機圖形學正融入于包括電影制作、醫療影像,以及3D建模建筑等各行各業。光照效果的計算是生成逼真圖形圖像的基礎,而全局光照則是計算機圖形學中最有前景以及最活躍的研究方向之一。傳統的全局光照需要光線跟蹤,因而會導致計算量較大從而達不到實時渲染的目的。而對于靜態場景來說,對場景進行預計算則是一種可以大大減少實時渲染時間開銷,有效提高效率的方法。
光照探針技術是在實時渲染中一種快速的近似光照技術。它的優勢是將光照傳輸過程中的一些計算預先存儲在光照探針中,在實時渲染時便可以發揮性能優勢。通常的光照探針需要手動在場景中進行放置,而且存在漏光等情況。本文實現的算法可以較好的解決手動調整探針位置及漏光缺陷,達到實時渲染的目的。
由于實時渲染的要求,利用預計算進行全局光照的計算是一種常用方式。Greene[1]在1986年提出了Cube Mapping,將周圍環境存儲在一張立方體貼圖的六個面上。Sloan[2]在2002年提出PRT(Pre-computed Radiance Transfer)方法,該方法將全局光照中復雜的光照計算利用一個光線傳輸函數作為輸入,運用球諧函數及預計算,將光照的多次反射的計算轉變為簡單的內積計算。Crassin[3]在2011年提出了著名的圓錐體素光線追蹤算法(Voxel Cone Tracing),該方法將場景中的網格數據編碼成一個多層次的體素八叉樹結構,采用圓錐體光線跟蹤,該結構可以大大加速光照及可見性的計算。Mcguire[4]在2017年提出利用新編碼的光照探針數據結構來進行預計算,從而將光線跟蹤轉變為類似深度比較的快速計算方法。
Cigolle[5]在2014年的八面體映射是一種對本文算法比較友好的映射方式,即擁有像球面映射一樣的將整個球面映射到一張紋理的能力,又可以擁有立方體映射的線性映射。用八面體映射存儲球面分布,畸變程度較小,而且比立方體映射擁有更好的邊界處理。
本節內容首先介紹全局光照的理論基礎渲染方程,以及本文實現過程中所采用的IBL及PBR算法,最后介紹了本文采用算法的實現細節。
在計算機圖形學中,渲染方程描述光能在場景中的流動,是一切全局光照的理論基礎。渲染方程如下:

渲染方程考慮了物體的自發光,也就是式(1)中的Le(p ,v)項,描述的是物體表面p處在方向v上的輻射亮度。L0(r(p ,l),-l)這一項代表的是點 p處l方向的入射輻射亮度,在點p處l方向的入射輻射亮度等于反方向-l處其它點的出射輻射亮度,該點由光線投射函數r(p ,l)確定,該函數會計算從點p出發在l方向上光線擊中的第一個表面的點的位置。
渲染方程可以實現完美且逼真的全局光照效果,但由于計算復雜度較高,對于需要實時計算的場景來說成本極高。
基于物理的渲染(Physically Based Rendering),是指基于現實世界物理理論來對真實世界進行模擬的一類技術的集合,使得渲染更具有真實感。
一般來說,基于物理的渲染需要滿足以下的三個條件:
(1)微平面表面模型
(2)能量守恒
(3)基于物理的BRDF模型
微平面表面模型是指所有的表面在接近于微觀之后都存在著各種各樣粗糙程度不同的細小鏡面。根據粗糙程度的不同,光線的反射也就不同。一個平面越是粗糙,其表面的微平面排序就越混亂,反射光線也就更發散;一個表面越是光滑,其反射光線也就越集中,形成比較銳利的反射效果。
能量守恒是指出射光線的能量永遠不能超過入射光線的能量。當一束光線碰到平面時,會形成一個反射和一個折射,被平面反射開來不會進入平面的那部分稱為鏡面反射光照,而進入平面被平面吸收的那部分被稱為漫反射光照。由于光在傳播過程中存在能量損失,所以鏡面反射加漫反射的能量總和永遠不會超過入射光線的總能量。
BRDF模型(雙向反射分布函數)描述了入射光與反射光的關系,用于定義入射方向的輻射照度(irradiance)如何影響出射方向的輻射度(radiance),常用的BRDF模型為Cook-Torrance模型,將反射分為漫反射與鏡面反射兩部分,如式(2)所示:

基于圖像的光照(Image-Based Lighting,IBL)技術,主要是指以圖像格式存儲某種形式的光照度量(例如輻射照度或輻射亮度),在渲染時將相應部分的光照計算轉變為紋理數據的查詢讀取,可以大大加快光照計算的速度,可以廣泛應用于離線或實時渲染。
為簡化復雜的蒙特卡洛積分計算,通過將渲染方程分為兩部分,我們可以單獨對漫反射與鏡面反射的積分值做預計算,將結果保存供后續實時渲染使用。
(1)Diffuse IBL
觀察漫反射部分的積分,其中Lambertian漫反射項是常數,如式(3)所示,將積分項中的Lambertian漫反射項移出,假設 p在原點(環境貼圖中心),那么對于每一個半球空間中的采樣方向,該積分項只與wi有關。我們可以預計算立方體環境貼圖,在每個采樣方向上存儲由卷積得到的漫反射積分結果。

如圖1所示,對于每個輸出采樣方向w0,通過對半球Ω上的大量方向ωi進行離散采樣并對其輻射度取平均值來解輸出采樣方向w0的積分。

圖1半球空間輻射度采樣
圖2所示是一個環境貼圖以及通過對它采樣輻射度取均值得到的立方體貼圖,這樣的立方體貼圖稱為輻照度圖(Irradiance Map)。
(2)Specular IBL
接下來解決鏡面反射的積分預計算,如式(4)所示:

其中,被積函數中的 fr( )p,wi,w0是BRDF函數。從式子中可以發現,鏡面反射積分取決于觀察方向w0與法線方向n兩個變量,與漫反射積分項不同??梢詫⒃瓉淼姆e分拆成兩項,將這兩項分別保存在兩張紋理中。

圖2環境立方體貼圖及生成的輻照度圖
第一部分的預計算得到的紋理為預過濾環境貼圖。當給定一個物體表面,若其表面的粗糙程度越高,則反射的內容越模糊。因此,考慮加入物體的粗糙度,將物體的粗糙度劃分成幾個等級,每個等級預計算一遍積分,并存儲到立方體貼圖中的一個多級漸變紋理(Mipmap)中。我們為生成的預過濾環境貼圖構建mipmap,越粗糙則存儲到mipmap的等級越高。后一部分為BRDF函數積分,可以構建一個二維查找表,橫坐標取值為法向量與入射光線方向的點積,縱坐標為粗糙度。遍歷橫縱坐標。計算公式中兩項積分的結果,存儲為紋理的像素值,最后渲染時使用紋理坐標去索引像素值。
首先將光照探針以一種均勻的網格均勻放置在空間中(本文所用的為2×2×2探針網格),將探針編碼為一個存儲以下信息的數據結構,如圖3所示:

圖3一個光照探針中的數據
(1)該光照探針的入射輻射亮度radiance
(2)每個入射光照所在表面的法線normal
(3)光照探針中心到每個入射光照方向上的最近表面的距離distance
有了上述信息,便可以進行光線跟蹤計算,在這里,普通算法與場景求交的光線跟蹤運算可以轉變為在光照探針中進行,由于光照探針中存儲的深度貼圖中包含了場景的幾何信息及幾何表面的漫反射顏色值,所以只需在光照探針中找到光線與每個光照探針的深度貼圖相交的位置,便能取得該光線的入射光照。
之后采用八面體投影,將立方體貼圖映射到八面體貼圖上,投影的結果是一個分段的線性直線線段,因此光線跟蹤就轉變為在八面體貼圖中進行像素遍歷,在探針中用該線段經過的紋素與探針中心的距離與之前預存儲的徑向距離信息(distance)進行比較,判斷得到交點。
對于整個場景,第一步是選擇一個光照探針進行光線追蹤,如果在該光照探針中沒有找到相交點,那么則繼續按照一定的方式尋找下一個光照探針繼續執行之前的操作,如果光線在某個光照探針中找到相交點,那么則讀取對應位置的輻射亮度值。
該算法在渲染時,采用八個光照探針插值的方式來計算漫反射光照,為了避免光泄露問題,在渲染時,一般的三線性插值是不夠的,需要增加一個背面檢測的插值方式以及切比雪夫可見性判斷的插值方式,將對當前渲染點貢獻的探針的權重降低。
本文實驗采用的實驗環境為Intel Core i5-4460的CPU,NVIDA GeForce GTX 960的顯卡,DDR3 16G的內存,圖4展示了使用8個光照探針的康奈爾盒的全局光照效果,幀率穩定在60fps。

圖4康奈爾盒效果圖
在相同的硬件環境下,圖5分別展示了使用living-room場景8個光照探針的直接光照與全局光照的效果對比。

圖5
圖6為鏡面反射的細節圖,可以看到該算法可以比較好的渲染出比較真實的效果。

圖6鏡面效果圖
傳統的光線跟蹤算法計算量較大,對于大規模場景開銷太大。本文實現了一種利用光照探針預計算實現全局光照的算法,該算法采用預計算的方法,將場景中的信息預先存儲在光照探針中,將傳統的光線跟蹤算法的光線與場景的求交運算轉變為在探針中進行深度比較求交,大大節省了光線跟蹤帶來的開銷,可以做到對靜態場景進行實時渲染。
同時該算法由于是采用預計算方式,所以只能用于靜態場景,不能滿足動態場景的實時渲染。另外該算法在空間中均勻放置探針,若對于大規模場景來說,規則放置的光照探針未考慮場景的光照及幾何信息,信息類似的探針會比較多,難免存在一定的數據冗余。以上的缺陷都是接下來該算法需要優化以及研究的方向。