王振
(四川大學計算機學院,成都 610065)
增強現實技術是一種在屏幕上把虛擬世界與現實世界融合在一起的技術,在電子游戲,電影動畫,教育娛樂等領域都有廣泛的應用前景。因此研究者投入了大量的研究,目前增強現實技術中的光照渲染模塊的常見解決方案是基于圖像渲染技術(IBL)[1],此外研究光照渲染則無法避開陰影模擬,因此陰影生成算法也是研究者主要研究方向之一。
我們常見的生成陰影的算法有Shadow Map[2]和Shadow Volume[3]。Shadow Map的原理是假設你從光源處向外看,所看到的物體都會出現在光線下,物體背后這些無法看到的區域即為陰影區域。Shadow Volume的基本原理是根據光源和三維模型的位置關系計算出三維模型的陰影體,然后對所有三維模型進行模板測試和深度測試,以確定三維模型會不會受陰影影響[4]。Shadow Map和Shadow Volume都可以得到逼真的陰影效果,但是Shadow Map處理動態光源時開銷過大,因此常用于靜態場景中的陰影計算。而因為需要計算模型的輪廓作為初步步驟,Shadow Volume計算量較大。同時,這兩種算法需要一個必不可少的條件,即必須知曉光源的位置以及光源強度。但是在基于圖像渲染技術的應用場景中,無法直接獲得光源相關信息,因此如果需要渲染模型陰影的話,則必須首先通過其他手段獲取光源信息,然后使用Shadow Map或Shadow Volume技術生成模型陰影。例如,Yufei Zhang[5]等人通過選擇幾個特征點來計算光源的方向與強度;Sato[6]等人在已知輔助物幾何模型的情況下,采用自適應采樣框架用于估計光源方向。Lalonde[7]等人利用單幅圖像中天空、地面、垂直表面單個光照線索估計太陽光位置的概率分布圖,從而得到光源的位置。計算出光源位置以及光源強度之后,使用Shadow Map或者Shadow Volume技術渲染模型陰影。
本文由于考慮到運用基于圖像渲染技術生成陰影時的缺陷——無法直接獲取光源位置以及光源強度,除非事先估計出場景的光源位置與光源強度,因此本文提出了一種應用于增強現實場景的陰影生成算法,該陰影生成算法無須分析出光源位置以及光源強度,僅僅使用HDR全景圖模擬三維物體周圍環境光照以及分析三維模型頂點可見性,最后再使用屏幕空間環境光遮蔽技術豐富陰影細節,從而實現逼真的陰影模擬效果。下面章節將詳細介紹該陰影生成算法。
高動態范圍圖像(High-Dynamic Range,HDR)[8],相比普通圖像,可以提供更大的亮度范圍以及更豐富的圖像細節,并且可以反映出真實環境中的光照效果,這是因為HDR使用新型編碼方式,可以表達的亮度范圍為0~216。相對而言,普通圖像則針對人類視覺系統進行編碼,亮度范圍僅為0~255。但是真實世界的亮度范圍為0~108,普通圖像由于編碼原因顯然無法表達廣闊的亮度范圍。因此,模擬三維模型周圍的環境光照,選用HDR圖像更為合適。
此外,HDR圖像相比普通圖像具有更好豐富環境細節,亮度層次更加明顯。如圖1所示,圖像中已經被紅色線圈圈住的兩塊白色區域太陽以及白色石塊,同屬于顏色相近的白色,在普通圖片上根據像素亮度值并不能分辨,如圖2所示,但是由于HDR圖像具有更大的亮度范圍,像素相近的白色太陽與白色石塊在亮度維度上差別很大。因此這就消除了使用HDR全景圖模擬真實環境時,顏色與光源相近的物體對模擬實驗的影響。

圖1 HDR圖像

圖2 不同類型圖片的亮度表示范圍
由于HDR圖像擁有更接近自然光亮度范圍的特性,以及可以表達更豐富的環境細節,因此,本文選用HDR全景圖模擬真實場景中的光照。具體用法將在2.1小節中說明。
Imari Sato[9]等人說明了物體陰影產生的原因是由于光線被其他物體所遮擋。真實世界的光線包括自光源例如太陽、電燈的光線,以及來自其他物體的反射的光線,而陰影的形成與三維模型頂點對于不同種類光線的可見性程度有直接關系,因此研究三維模型頂點的可見性對于陰影的研究是至關重要的。

圖3 三維模型頂點可見性分析示意圖
假設三維模型處于半球體內,接收來自太陽的直接光線和來自周圍環境的反射光線,如圖3所示。半球表示三維模型周圍的真實環境,紅點表示三維模型的某個頂點,紅色射線表示來自光源的直接光線,紅色圓圈表示光源區域,藍色線條表示來自環境的環境光線。在圖3(a)中,頂點p對于部分環境光線是不可見的,而對于直接光線是可見的,根據陰影遮擋原理可得出p點處于非陰影區域的結論。而在圖3(b)中,直接光線被遮擋,頂點p無法接收到來自光源的光線,因此可以判斷p點是處于陰影區域內的。
在傳統IBL陰影實現方案中,首先通過設置閾值或者使用Banterle等人[10]研究的Median cut算法確定HDR圖像中的光源位置,該光源位置即HDR全景圖中高亮區域方位,然后使用傳統的Shadow Mapping技術來渲染模型陰影。本文考慮到HDR圖像的特點,即可用HDR全景圖模擬周圍環境光照,提出了一種適用于IBL渲染方案的陰影實現算法。
本文提出的陰影生成算法的設計思路簡述如下,首先將HDR全景圖每個像素視為光源,HDR全景圖像素的不同亮度值可視為每個像素光源的光強度。其次,研究三維模型周圍地板上頂點對于HDR全景圖上密布像素光源的可見性,并且計算未遮擋光線對頂點的光照影響。最后,使用屏幕空間環境光遮蔽技術計算三維模型褶皺處的陰影,提升模型陰影細節效果。
本算法選用HDR全景圖模擬真實場景中的光照,首先,將HDR全景圖映射到一個球體上面,其次,將三維模型放入球體中間,如圖4所示。最后,將HDR全景圖中每個像素看作光線發射器,可以稱之為像素光源,如圖5所示。此時,像素光源既包括真實世界光源,又包括真實世界的環境光。通過這種方式,我們可以有效地捕捉真實環境中的光照信息,進而模擬真實環境的光照。

圖4 全景圖與模型關系

圖5 像素光源
本算法將HDR每個像素看作一個像素光源。我們首先確定像素光源的位置,由于HDR全景圖是映射在一個球體上面,因此我們可以使用球體極坐標系來表示光源的位置,如公式(1)所示。

此外還需要計算每個像素光源的光源強度,根據人眼對于RGB三個分量不同的感知權重,提出了將像素值 p(r,g,b)轉化亮度的公式(2)。

其中,L(p)表示像素 p 的亮度,p.r、p.g、p.b 分別表示像素p對應的RGB值。Factor.r、Factor.g、Factor.b分別表示人眼對于RGB顏色的感知權重。
然后當我們使用HDR全景圖渲染三維模型頂點時,我們需要識別出該點的所有入射光線。入射光線范圍是以該頂點為球心,以該頂點所在面片的法向量為方向向量的半球面,如圖6所示。

圖6 模型頂點半球光照模擬
其中ω0為模型頂點所在面片的法向量,ωi為所有的入射光線。為了將HDR全景圖像素光源對三維模型以及其周圍地板頂點的光照影響數據化,本文采用黎曼積分來計算半球面像素光源對三維模型頂點的光照影響,公式見(3)。

該公式表示在三維模型物體,或者在三維模型周圍地板上頂點p處,出射光線方向的半球領域內采樣入射光線的方向向量,并計算其積分值。其中,L0'(p,ω0)表示點p在出射光線方向ω0上的出射輻射率,Li'(p,ωi)(n*ωi)表示點p在入射光線方向ωi上的入射輻射率,即發出入射光線的像素光源的亮度,(n*ωi)表示在p點的法向量與入射光線方向向量夾角的余弦值。
本文使用HDR全景圖模擬真實世界的環境光照,同時我們使用黎曼積分計算三維模型頂點所有入射光線——以法線向量為方向的半球面區域,用于衡量真實環境對三維模型的光照影響。而陰影的產生與三維模型頂點是否處于陰影區域與該頂點接收多少入射光線,以及接收何種類型的入射光線有直接關系。
正如1.2小節所述,在真實世界中,存在兩種光線,一種是光源發射的光線,另一種是其他物體的反射光,映射到HDR全景圖中,則分別對應HDR全景圖中高亮區域像素光源發射的光線與非高亮區域像素光源發射的光線。本文陰影生成的基本思路是判斷三維模型的頂點是否在陰影處,以及該頂點的陰影的深淺程度,這與該頂點接收多少入射光線,以及接收何種類型的入射光線有直接關系。
首先研究三維模型投射到地面的陰影。為了計算三維模型投射到地面的陰影,需要在三維模型下面放置一個板子。為了方便展示,我們將半球模型降維到二維半圓模型,如圖7(a)所示。
圖 7(a)(c)中,半圓紅色弧線表示 HDR 全景圖的高亮區域,反映到真實環境中則表示太陽等光源,藍色弧線表示HDR全景圖的非高亮區域,反映到真實環境中表示天空以及周圍環境顏色,方塊表示一個三維模型,在該三維模型放置到下面一個板子上。由圖7(a)可看出,OA段接收的來自光源的光線被三維模型遮擋,因此判斷屬于陰影區域。相對而言,AB段接收到部分來自光源的光線,并且在從A趨向B的過程中,接收來自光源的光線越來越多,因此陰影的強度也再越來越小,從而形成軟陰影。這是一個線性的變化,因此軟陰影的強度也是一個線性變化的效果,進而可以呈現一個逼真的軟陰影視覺效果。圖7(b)渲染的效果圖可以展現這些特性,得到一個逼真的陰影效果。此外,本文的光照模型還可以處理多光源的情況,如圖7(c)(d)所示。相比單個光源模型,由于圖7(c)中AB段可以接收到來自Light Source 1的光線,但是來自Light Source 2的光線被遮擋,無法被接收,因此AB段的陰影強度要小。然而圖7(c)中的BC段,由于來自兩個光源的光線都被遮擋,因此BC段的陰影強度強。實驗效果如圖 7(d)所示。
其次研究三維模型的自陰影。三維模型自陰影即三維模型背光部分陰影。如圖8(a)所示,HDR全景圖的高亮區域對三維模型直接照射,三維模型向陽區域同時受到了直接光線和間接光線的影響,而三維模型的背光區域僅僅受到了間接光線的影響,因此,背光區域相對偏暗,呈現自陰影的陰影效果。如圖8(b)所示箱子的背光區域相對于向光區域亮度要小很多。

圖8 自陰影光照模型和效果圖

圖7 光源模擬與效果圖
綜上所述,本文模擬了三維模型投影到地面上的陰影,以及三維模型本身的自陰影。該陰影算法的核心是通過研究三維模型頂點的對于光線的可見性來判斷三維模型的頂點是否在陰影處,以及該頂點的陰影的深淺程度。在本算法中,如果該頂點的入射光線被遮擋,則該條光線無需參加光照積分計算。
光線與物體空間的碰撞檢測算法一般是計算光線與三維模型是否相交。碰撞檢測算法中常見的劃分物體空間的方法為空間剖分法。空間剖分法是將三維模型按照某種空間剖分技術劃分成若干小的單元,使三維模型的一個或者多個面片屬于同一個單元。我們綜合考慮劃分層次,以及遍歷層次樹的開銷等因素,本算法采用八叉樹空間剖分算法。
八叉樹空間劃分是將立方體分割成八個小立方體,然后遞歸地分割小立方體。在本算法中,對場景的AABB包圍盒按照模型的三維維度進行遞歸劃分,將三維模型分割為八份,然后再對每個分割后的小包圍盒進行分割,直到每個小包圍盒中的三角面片個數達到一定的閾值。我們使用線性存儲的方式將八叉樹結構以及三角面片數據存放到TBO中,并傳遞到GPU與光線進行相交測試。
光線與三維模型的相交測試即判斷光線與三維模型的面片是否相交,最簡單的方法是,將三維模型的所有三角面片數據傳遞到GPU,然后讓光線與三角面片一一求交,但是這種方法效率底下。為了簡化相交測試計算量,本文采用八叉樹組織數據。由于八叉樹節點是保存分割后的AABB包圍盒的數據,因此,本文首先使用Slam算法計算光線與AABB包圍盒是否相交,并遞歸計算到葉子節點AABB包圍盒,最后再與葉子節點AABB包圍盒中的三角面片進行相交測試。
陰影渲染是個復雜的工作,渲染出一個逼真的陰影效果需要考慮很多細節因素,例如軟陰影,例如三維模型本身褶皺處的自陰影,這些細節嚴重影響陰影的效果。軟陰影在2.2小節中已經做了相關論述,本算法生成的陰影本身就具有逼真的軟陰影效果。因此在優化模塊,本算法僅僅對三維模型褶皺處的自陰影進行優化。
在提升三維模型褶皺處陰影效果方面,本文采用屏幕空間環境光遮蔽技術。屏幕空間環境光遮蔽技術的原理簡述如下,對于鋪屏四邊形上的每個片段,根據周圍深度值計算一個遮蔽因子。該遮蔽因子會被用來減少或者抵消片段的環境光照分量,從而改善物體表面渲染效果。公式(4)給出了在當前像素i處,遮蔽因子的表達式。

其中Pi表示臨近區域內采樣像素集,n表示當前像素i在觀察空間中的法向量。函數d(ωi,j,n)用于判斷臨近區域內采樣像素點j對當前像素點的遮擋情況。遮擋情況由公式(5)表達。

其中(ωij?n)>0表示法向量在切平面正方向半球領域內采樣,而不等式Dep thj≥Dep th Viewj表示比較采樣像素點j屏幕空間下的深度值與觀察空間下的深度值,從而判斷是否被遮擋。經過實驗證明,使用屏幕空間環境光遮蔽技術渲染模型褶皺處陰影可以得到一個更為逼真的陰影效果,渲染效果對比圖如圖9所示。

圖9 效果對比圖
本文使用屏幕空間環境光遮蔽技術對陰影算法進行優化,處理了三維模型褶皺處的陰影,陰影的整體視覺效果得到了很大的提升。
本實驗設備為聯想拯救者Y7000筆記本(CPUIntel Core i7-8750H 2.20GHz,GPU NVIDIA GeForce GTX 1050 Ti),Visual Studio 2015 作為軟件開發平臺,以及OpenGL作為三維圖形開發工具。
為了驗證本文提出的基于可見性的陰影生成算法是否生成一個合理并且逼真的陰影效果。本文做兩個對比實驗,第一個對比實驗是本文算法與成熟的陰影生成算法Shadow Map在同一場景下,使用同一三維模型分別渲染三維模型的陰影。如圖10所示。由該對比實驗可以看出,本文算法生成的陰影效果逼真,并且具有逼真的軟陰影視覺效果,再加上屏幕空間環境光遮蔽技術的處理,在陰影細節有很大的提升,因此在該方面本算法要優于Shadow Map。

圖10 Shadow Map陰影算法與本文陰影算法陰影區域對比圖
第二個對比實驗是使用本文算法,同時渲染不同場景下,同一三維模型的陰影。如圖11所示,由陰影效果對比圖可以看出,場景的環境光照有較大變化時,
本文算法同樣可以逼真的模擬三維模型的陰影。

圖11 不同場景下使用本文算法生成的效果對比圖
本文提出了一種針對基于圖像渲染技術中的陰影生成算法,我們復用IBL技術中的輸入條件——HDR全景圖,并利用三維模型頂點的可見性原理,分析每個三維模型頂點對周圍環境的感知程度,設計出一種陰影生成算法,并且使用屏幕空間環境光遮蔽技術來提升陰影細節效果,從而得到一個效果逼真的陰影。
雖然我們的算法取得了不錯的實驗結果,但是仍有些限制與不足需要我們繼續研究。一方面,我們必須使用HDR全景圖,普通的全景圖無法反映真實的環境信息。另一方面,由于硬件運算性能的限制,無法處理復雜的三維模型。在后續的研究中,我們將著重解決這兩個方面的問題。