天天看點

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

簡介

陰影渲染在真實感圖形渲染中非常重要,它作為一種視覺上的提示,将場景的空間結構和物體的相對關系回報給使用者。研究表明,陰影的有無對使用者認知空間物體位置具有重要作用[1]。然而,實時、高清的陰影渲染始終是一個有挑戰性的問題。早年的計算機圖形學研究中,兩種高效的陰影渲染技術被提了出來,分别是陰影體算法(Shadow Volume Algorithm)[2]和陰影深度映射(Shadow Depth Mapping)[3],後來許多陰影渲染技術都是在它們兩者的基礎上進行改進得到的。

Shadow Mapping的基本思想是,物體之是以會處在陰影當中,是由于在它和光源之間存在着遮蔽物。是以,首先我們以光源為視點,得到一個所有物體的深度圖;然後将視點移回到錄影機,對每個像素點計算它和光源的距離,如果這一距離大于深度圖中的深度,則說明該物體被遮擋了;否則,說明沒有被遮擋。在光源不移動的情況下,無論錄影機位置如何移動,深度圖都是不變的,是以将大大節省計算量。但它的缺陷是無法處理移動光源的情形。另一個缺陷在于,深度圖是在像素上做的,是以天生具有鋸齒。如果像素的分辨率不高,則鋸齒現象會很明顯;如果分辨率太高,則又很大地增加了計算量。

Shadow Volume的基本思想是,每個物體在光照下,投下了一個錐形的陰影體。如果我們觀測的點在陰影體中,那麼它就是陰影;否則它就不是陰影。具體實作上,可以分為Z-Pass[4]和Z-fail[5]兩種方法。Z-Pass從錄影機位置出發,發射一條光線到目标點,當此光線從錐體的外部進入内部時,計數器加1;當光線從錐體内部出去時,計數器減1。顯然,如果錄影機本身不在陰影中,那麼如果最終計數器為正,則說明目标點在陰影中;如果計數器為0,則說明不在陰影中,如圖1所示。

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

圖1. 光線從錄影機向目标點出發,每次從錐體外部進入内部則計數器加1,内部進入外部則計數器減1。由計數器為正或為零,可以判斷目标點是否處于陰影中[6]。

Z-Pass不能适用于錄影機本身在陰影中的情況,因為這樣計數器可能為負。為此,[5]提出了Z-Fail算法,它的光線從足夠遠的地方出發(來保證在非陰影區域),先經過目标點,再終止在視點。由于出發點一定在非陰影區域,是以這時計數器就不會出現負值,如圖2所示。

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

圖2. 光線從遠處向錄影機出發,每次從錐體外部進入内部則計數器加1,内部進入外部則計數器減1。由計數器為正或為零,可以判斷目标點是否處于陰影中[6]。

本文探究Shadow Mapping和Shadow Volume在近年來的發展和進化,将以[7]和[8]為兩種思路的代表方法,描述其核心思想和具體算法。

相關工作

不同的Shadow Mapping

在實際工程中,Shadow Mapping的一個主要問題在于自遮擋。由于浮點數和采樣上的誤差,如果我們以物體表面深度值作為Shadow Mapping中的基準,則由于小誤差的緣故,一些深度略大于Shadow Mapping的表面點會被判定為在陰影中,進而形成自遮擋。[9]提出了一種中值Shadow Mapping(Midpoint Shadow Mapping)的方法,即不采用物體表面深度,而是物體和光源最近的兩個面的平均,作為Shadow Mapping中的基準。這樣,物體向光面和背光面的點計算時都有了一定的容錯範圍,解決了部分自遮擋的問題,如圖3最左側圖所示。

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

圖3. 左圖為中值Shadow Mapping,中圖和右圖為中值 Shadow Mapping可能出現的陰影點誤判情況[10]

對中值Shadow Mapping方法的一個拓展是雙Shadow Mapping(Dual Shadow Mapping)[10]。它是為了解決中值Shadow Mapping中仍可能出現的少數陰影點誤判問題而誕生的。雙Shadow Mapping除了儲存了深度資訊外,還維護了一個自适應的偏置量(Bias),進而在一些特殊點上也能得到正确的陰影。

在雙Shadow Mapping的基礎上,[11]提出了一種對Shadow Mapping進行壓縮的方法CSM(Compressed Shadow Maps),[7]的方法可以視為是[11]在高維上的拓展。[12]也提出了一種通過對Shadow Mapping深度進行編碼的壓縮方式,但[11]和[12]都沒有完全挖掘Shadow Mapping的壓縮能力。

不同的Shadow Volume

Shadow Volume的第一個實作是Z-Pass[4],出于解決錄影機本身可能在陰影中的問題,[5]提出了Z-Fail算法。這兩個算法往往使用OpenGL中的模闆緩存(Stencil Buffer)來實作,但它們并沒有解決Shadow Volume中最大的問題,即不必要地計算了許多陰影輪廓。一些方法嘗試着減少部分陰影輪廓的計算,如[13]和[14],但它們仍沒有完整地解決這一問題。

[15]提出了另一類基于幾何體的陰影渲染方法。對于一個三角形在光照下形成的錐體,[15]使用三個面(分别對應三條邊)和三角形本身,将空間劃分為被該三角形遮擋的部分,和未被該三角形遮擋的部分。然後,[15]對空間建立空間二分樹(Binary Space Partitioning,BSP),進而将空間劃分為被遮擋區域和未被遮擋區域。同時,由于樹對于檢索的優良性質,我們可以高效地查找空間中一點是否屬于陰影區域。然而,建立空間二分樹需要對許多平面進行求交和裁剪,且需要大量的存儲空間和計算代價,同時因為一些數值計算上的不穩定性,是以[15]的方法實用性不強。

[16]在[15]的基礎上進行了改進。它們在BSP的基礎上增加了一個表示空間相交的子樹,進而建構了一棵物體三叉樹(Ternary Object Partitioning,TOP)。這一改變避免了裁剪操作,是以大大提升了穩定性和效率。而[8]的方法可以視為是[16]的進一步拓展。

高分辨率Shadow Mapping壓縮

高分辨率的Shadow Mapping之是以效率較低,是因為高分辨率下的深度紋理難以快速地檢索和周遊。深度紋理實質上就是圖檔,對于圖檔,我們有一些多分辨率分解的方法(如小波分解或四叉樹分解),它們可以将低頻的資訊存儲在粗粒度的層級,将高頻的細節存儲在細粒度的層級。通常,在有損壓縮下,在細粒度上系數較小的項就會被移除,隻留下系數較大的項,進而提升效率,是以細粒度的層級往往是稀疏的。但是對于無損壓縮,我們就不能忽略細粒度上的小系數,進而細粒度的層級就不稀疏了,消耗的代價也就更大。

[7]的主要貢獻是,找到一種Shadow Map的替代品,這一替代品可以增加分解後的稀疏性。具體而言,[7]使用光線照到物體表面的入口,和穿透物體從另一側穿出的出口之間的區間,來替代原本單一的表面。顯然,這和雙深度Shadow Map是一緻的。對于隻有單面的物體,或者不封閉的物體,我們需要一個額外的深度上限,進而在這些像素上也形成區間。完成這一替代後,我們的目标就轉化為如何在一系列的區間中,嵌入連續的平面,進而增強分解後的稀疏性。[7]首先提出了兩種貪心的構造方法,得到區間中的連續深度平面;然後使用四叉樹對這些平面進行編碼;最後提出如何在此資料結構上,進行周遊和查詢,進而完成陰影的渲染。

建構

第一個需要解決的問題是,如何對每個像素計算深度區間。區間下界顯然就是模型的表面(即正常Shadow Map的值),區間上界來自于模型的“第二層”,它往往采用了深度剝離(Depth Peeling)[17]的方法。考慮從光源發射向像素的光線,以及一個初始化為0的計數器。當光線和模型的外表面相交時,計數器加1;當光線和模型内表面相交時,計數器減1。當光線第一次相交到模型,這就是區間下界;當計數器的值回歸到0時(這裡僅考慮了封閉模型,但考慮了封閉模型相交的情況),此時的交點就是區間上界。通過Depth Peeling算法,我們可以同時在所有像素上計算深度區間,是以是非常高效的。

得到每個像素上的深度區間後,我們需要找到一個區間内的、簡化的、分解後稀疏的平面。然而,在模型簡化問題中,對給定包圍殼中簡化表面的尋找,是一個已被證明的NP難的問題[18]。是以,[6]提出了兩個基于貪心算法的自頂而下和自底向上的算法,進而完成高效的平面尋找。

自頂而下的建構

自頂而下的建構從最粗的粒度,即整個Map開始。對于所有的區間,我們找到一個最合适的深度值,它落在盡可能多的區間内。對于包含這一深度值的區間,它們将被标記,并将以此深度作為自身的深度;對于不包含這一深度值的區間,它們将被放在粒度更細的下一層進行處理。對于下一層,我們采用四叉樹的方法,将Map分成了四塊,對每塊重複上述的操作,直到到達最細粒度的一層(即每個像素)或一整塊所有像素均已被标記。它的僞代碼如下:

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

算法1. 自頂而下的建構

上述過程沒有描述如何找到“最合适”的深度值。一種簡單的思路是,我們将深度離散化,然後周遊每一個區間,建構直方圖統計。顯然,“最合适”的深度值就是直方圖中最高的那一個。然而,均勻離散化代價太大,是以我們對每個區間的上界和下界進行排序,并統計直方圖,可以更高效地得到“最合适”的區間。如圖4所示。

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

圖4. 左圖為各個深度區間,右圖為深度區間的直方統計,進而找到“最合适”的深度

這一算法在最初需要 的複雜度用于排序,然後每一層需要周遊每個區間進行統計,複雜度為 ,而一共有 層,是以總複雜度仍為 。

自底向上的建構

自底向上的建構從像素開始。每次我們考察鄰近的四個像素,類似地找到一個“最合适”的最大深度子區間,使它落在盡可能多的像素深度區間内。對于那些包含“最合适”區間的像素,我們就不再額外記錄其區間值;對于不包含“最合适”區間的像素,我們将其保留。我們逐層向上,重複這樣的建構,直到到達最粗粒度的層。它的過程如圖5所示。

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

圖5. 從左至右表明了自底而上的建構方法

由于一次隻需要在四個區間内選擇“最合适”的子區間,我們就不需要進行耗時的排序操作了。同時,雖然它的複雜度和自頂而下的建構一樣(都是 ),但由于它的方法更适用于并行的架構,是以可以使用GPU進行加速。

四叉樹壓縮

四叉樹包含了三種節點:葉子節點、内部節點和空節點。葉子節點僅含有32位的深度值。内部節點不僅含有32位的深度值,還需要儲存樹的連接配接資訊。空節點不含有深度值,但也需要儲存樹的連接配接資訊。

對于内部節點和空節點,我們使用8位來存儲其4個子節點的狀态(每個子節點2位),狀态共有4種,即子節點不存在、子節點為葉子節點、子節點為内部節點和子節點為空節點。另外,有16位用于存儲第一個子節點的指針,由于子節點和它的兄弟節點連續存儲,是以隻需要存儲第一個子節點就夠了。考慮到4位元組的對齊,我們還要給内部節點和空節點加上1位元組的空間(或者也可以将16位指針擴充到24位,但[6]中實驗證明差別不大)。總之,内部節點占用了8個位元組,空節點和葉子節點分别占用了4個位元組。

樹的周遊

樹的周遊和普通四叉樹周遊沒有什麼不同。對每一個節點,我們可以通過8位的子節點狀态,加上16位的首子節點的指針,計算出每個子節點的指針,然後繼續疊代。

樹的檢索

高效的檢索也是Shadow Mapping的一個重要組成部分。出于避免鋸齒的考慮,通常我們會采用PCF(Percentage Closer Filtering)[19]的方法。PCF方法指判斷陰影時,并不判斷一個像素是否在陰影區域中,而是在一個以該像素為中心的固定視窗中,對鄰近像素的Shadow Map深度值求平均,以此平均數來判斷是否為陰影。顯然,它可以一定程度上解決鋸齒的問題。

Shadow Map堆

二維上的四叉樹壓縮方法,可以很容易地拓展到三維的八叉樹方法。我們可以将一系列Shadow Map疊成一個堆,然後用八叉樹對整體進行類似的壓縮。這樣的方法可以渲染出面光源軟陰影的效果,也可以渲染移動光源的效果。對于面光源,我們在光源上進行采樣,進而将其視為多個帶權的點光源;對于移動光源,我們需要提前擷取光源的運動軌迹,提前計算好每個軌迹下的Shadow Map。面光源的效果如圖6左圖所示,移動光源效果如圖6右圖所示。

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

圖6. 左圖為面光源的效果,右圖為移動光源的效果

基于聚類和度量樹的實時陰影渲染方法

[8]的算法主要分成三步:聚類、度量樹建構、度量樹周遊。聚類是一個預處理的步驟,它将鄰近的三角形面片聚類成一個簇,然後基于簇的包圍體來計算陰影。聚類需要一定的權衡,即一方面聚類可以簡化模型,聚類程度越高模型越簡單;另一方面聚類後形成的包圍體會給陰影帶來誤差,聚類程度越高也就意味着誤差越大。[8]中選擇了球狀和膠囊狀的包圍體,也是出于平衡效率與效果的考慮得到的。

對于聚類好的簇,[8]定義了一個新的度量方式,并在新的度量方式下,對簇建構了樹狀結構。之是以需要新的度量方式,是因為在光源的視角下,球狀和膠囊狀的包圍體将變成圓柱形和膠囊圓柱形,進而過去的度量方式不再适用了。[8]提出了新的基于角度的度量方式。

對于每個像素點,我們需要确定它們是否在陰影之中,是以,我們需要知道它們和簇之間的相對位置關系。由于有了度量樹的資料結構,我們可以遞歸地完成這一周遊步驟。

聚類

聚類可以更加高效。對于 n n n個三角形面片,假設建立一棵樹需要 O ( n log ⁡ n ) O\left( {n\log n} \right) O(nlogn)的複雜度,那麼,當我們有一個聚類算法,每個簇中含有 p p p個三角形面片,再對簇進行建樹,則複雜度将下降到 O ( n p log ⁡ n p ) O\left( {{n \over p}\log {n \over p}} \right) O(pn​logpn​)。[8]的算法不依賴特定的聚類算法,但顯然,不同的聚類算法将産生不同的結果。

[8]采用的聚類算法如下。首先通過k-mean++算法找到一組中心點,這些中心點并不是随機分布的,而是彼此間距盡可能大,進而保證中心點盡量均勻地分布。然後,每個三角形面片被配置設定給距離它最近的中心點,形成這一輪疊代的簇。再次,中心點被重新調整為實際簇中各個三角形的中心。然後我們重複上述的步驟,直到結果收斂或每個簇中的三角形面片數量小于指定的門檻值。

包圍體建構

我們需要對每個簇建構包圍體。我們期待包圍體盡可能緊密地包圍着簇,又希望包圍體的結構盡可能簡單,進而降低存儲和運算時間。常見的包圍體有軸對齊包圍盒(Axis Aligned Bounding Boxes,AABB)和方向包圍盒(Oriented Bounding Boxes,OBB)。但是,考慮到我們更關心在光線透射下陰影的形狀,AABB和OBB投影後都成為了平截頭體,是以形狀并不簡單。作為替代,[8]采用了球狀包圍體,這樣投影後的形狀就是圓柱體。但是球形常常不能很好地緊密包圍三角形面片,是以[8]還采用了膠囊狀的包圍體。

我們還需計算簇的均值與方差。假設簇中的第 i i i個三角形面片的三個點為 p i p^i pi, q i q^i qi和 r i r^i ri,則它們的均值 μ \mu μ和方差 C C C的計算方式如下:

μ = 1 3 n ∑ i = 0 n ( p i + q i + r i ) \mu = {1 \over {3n}} \sum_{i = 0}^n \left( {{p^i} + {q^i} + {r^i}} \right) μ=3n1​i=0∑n​(pi+qi+ri)

C j k = 1 3 n ∑ i = 0 n ( p ′ j i p ′ k i + q ′ j i q ′ k i + r ′ j i r ′ k i ) {C_{jk}} = {1 \over {3n}} \sum_{i = 0}^n \left( {p'}_j^i {p'}_k^i + {q'}_j^i {q'}_k^i + {r'}_j^i {r'}_k^i \right) Cjk​=3n1​i=0∑n​(p′ji​p′ki​+q′ji​q′ki​+r′ji​r′ki​)

其中 n n n表示簇中的三角形面片總數, p ′ i = p i − μ , q ′ i = q i − μ , r ′ i = r i − μ p{'^i} = {p^i} - \mu ,q{'^i} = {q^i} - \mu ,r{'^i} = {r^i} - \mu p′i=pi−μ,q′i=qi−μ,r′i=ri−μ。

度量樹建構

在傳統Shadow Volume下,每個三角形面片投影的區域由四個平面組成(即三條邊分别對應一個平面,原三角形一個平面,包圍而成的不封閉幾何體),為了判斷空間一點是否在陰影區域,往往對空間建立空間二分樹(Binary Space Partitioning,BSP)或物體三叉樹(Ternary Object Partitioning,TOP)。然而,這些資料結構不适合于球狀包圍體和膠囊包圍體的情況,因為它們在光照下形成了圓錐體和膠囊圓錐體。

假設 是一個集合,則在此集合上可以定義一個度量空間 ,其中, 滿足如下條件:

  • 非負性: ∀ x , y ∈ O , d ( x , y ) ≥ 0 \forall x,y \in O,d\left( {x,y} \right) \ge 0 ∀x,y∈O,d(x,y)≥0
  • 對稱性: ∀ x , y ∈ O , d ( x , y ) = d ( y , x ) \forall x,y \in O,d\left( {x,y} \right) = d\left( {y,x} \right) ∀x,y∈O,d(x,y)=d(y,x)
  • 三角不等式: ∀ x , y , z ∈ O , d ( x , z ) ≤ d ( x , y ) + d ( y , z ) \forall x,y,z \in O,d\left( {x,z} \right) \le d\left( {x,y} \right) + d\left( {y,z} \right) ∀x,y,z∈O,d(x,z)≤d(x,y)+d(y,z)

對于如上定義的度量空間,我們可以建構一棵如下的度量樹:首先選擇一個 O O O中的一個元素 p p p,以及一個距離門檻值 δ \delta δ。這一距離門檻值自然地将 O O O分成了與 p p p距離小于 δ \delta δ的“近”子集 S n S_n Sn​,和與 p p p距離大于 δ \delta δ的“遠”子集 S f S_f Sf​,即

S n = { x ∈ O ∣ d ( p , x ) ≤ δ } S f = { x ∈ O ∣ d ( p , x ) > δ } \begin{aligned} & {S_n} = \left\{ {x \in O|d\left( {p,x} \right) \le \delta } \right\} \\ & {S_f} = \left\{ {x \in O|d\left( {p,x} \right) > \delta } \right\} \end{aligned} ​Sn​={x∈O∣d(p,x)≤δ}Sf​={x∈O∣d(p,x)>δ}​

對于具體這一Shadow Volume的場景,由于包圍體并非質點,是以元素之間存在最大距離和最小距離,則我們可以類似地将 O O O分成三份,即近子集 S n S_n Sn​、遠子集 S f S_f Sf​和相交子集 S o S_o So​,建構三叉樹,即

S n = { x ∈ O ∣ d f a r ( p , x ) ≤ δ } S f = { x ∈ O ∣ d n e a r ( p , x ) &gt; δ } S o = { x ∈ O ∣ d n e a r ( p , x ) &lt; δ &lt; d f a r ( p , x ) } \begin{aligned} &amp; {S_n} = \left\{ {x \in O|{d^{far}}\left( {p,x} \right) \le \delta } \right\} \\ &amp; {S_f} = \left\{ {x \in O|{d^{near}}\left( {p,x} \right) &gt; \delta } \right\} \\ &amp; {S_o} = \left\{ {x \in O|{d^{near}}\left( {p,x} \right) &lt; \delta &lt; {d^{far}}\left( {p,x} \right)} \right\} \end{aligned} ​Sn​={x∈O∣dfar(p,x)≤δ}Sf​={x∈O∣dnear(p,x)>δ}So​={x∈O∣dnear(p,x)<δ<dfar(p,x)}​

如圖7所示。

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

圖7. 左圖實際幾何體的關系,紅色代表遠物體,綠色代表近物體,黃色代表相交物體,虛線代表距離門檻值。右圖為左圖建構的樹,三個子樹分别為遠子樹,近子樹和相交子樹

球體和膠囊體的角度距離

有了度量空間和度量樹的宏觀概念後,[8]提出了在球體和膠囊體的空間中度量的具體方法。由于這是一個投影體的空間,是以歐氏距離将不再适用。取而代之的,是[8]提出的角度距離,即在視角下兩點之間的角度。假設光源為 O O O,空間内兩點 A A A和 B B B與光源的連線為 O A OA OA和 O B OB OB,則 A A A和 B B B的度量距離為 d ( A , B ) = A O B ^ d\left( {A,B} \right) = \widehat {AOB} d(A,B)=AOB

假設一個球體,其中心點為 C C C,半徑為 r r r,則球内所有點和 點的度量距離均小于 α = arcsin ⁡ ( r ∣ O C ∣ ) \alpha = \arcsin \left( {{r \over {|OC|}}} \right) α=arcsin(∣OC∣r​)。對于膠囊體,情況稍稍複雜。假設膠囊體軸上距離 O O O點最近的點為 X X X,則膠囊體内部的點 P P P和它對應的軸上的點 X ′ X&#x27; X′,則 P P P和 X ′ X&#x27; X′的度量小于 arcsin ⁡ ( r ∣ O X ′ ∣ ) ≤ arcsin ⁡ ( r ∣ O X ∣ ) \arcsin \left( {{r \over {|OX&#x27;|}}} \right) \le \arcsin \left( {{r \over {|OX|}}} \right) arcsin(∣OX′∣r​)≤arcsin(∣OX∣r​)。為了節約計算時間,我們就使用 α = arcsin ⁡ ( r ∣ O X ∣ ) \alpha = \arcsin \left( {{r \over {|OX|}}} \right) α=arcsin(∣OX∣r​)來估計。有了度量方式後,我們就可以定義兩個體的近距離 d n e a r d^{near} dnear和遠距離 d f a r d^{far} dfar:

d n e a r ( V 1 , V 2 ) = d ( C 1 , C 2 ) − ( α 1 + α 2 ) d f a r ( V 1 , V 2 ) = d ( C 1 , C 2 ) − ( α 1 − α 2 ) \begin{aligned} &amp; {d^{near}}\left( {{V_1},{V_2}} \right) = d\left( {{C_1},{C_2}} \right) - \left( {{\alpha _1} + {\alpha _2}} \right) \\ &amp; {d^{far}}\left( {{V_1},{V_2}} \right) = d\left( {{C_1},{C_2}} \right) - \left( {{\alpha _1} - {\alpha _2}} \right) \end{aligned} ​dnear(V1​,V2​)=d(C1​,C2​)−(α1​+α2​)dfar(V1​,V2​)=d(C1​,C2​)−(α1​−α2​)​

其中, V i V_i Vi​是以 C i C_i Ci​為中心, α i \alpha_i αi​為度量邊界的包圍體。

建構三叉度量樹

建構度量樹的過程和快速排序類似,首先,我們确定一個根包圍體(作為根節點),以及一個度量門檻值 ,然後我們根據每個包圍體和根包圍體的距離,将它們分為近子集、遠子集和相交子集。三個子集分别作為根節點的三個子節點,然後每個子節點遞歸重複上述步驟。通常,根節點的選擇可以是随機的,但[20]證明了選擇一個和其他各個包圍體距離盡可能大的包圍體作為根節點是一個更好的選擇。理想狀态下的 可以将剩餘的包圍體均勻地分成兩份,是以,它往往被選擇為根包圍體和其他包圍體距離的中位數[21]。

周遊

對于目标點,首先和根節點的包圍體求交,如果相交,則說明目标點在陰影中;如果不相交,則計算目标點和根節點的度量距離,如果距離小于 ,則在近子集和相交子集中重複上述步驟;如果距離大于 ,則在遠子集和相交子集中重複上述步驟。此過程疊代進行,直到找到相交的包圍體或周遊結束。以上步驟可以有三點優化:

第一,如果目标點比整棵子樹上所有的包圍體距離光源的度量距離更近,則我們就可以直接砍掉整棵子樹而不需要做周遊。

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

圖8. 左圖和右圖分别表示了球狀和膠囊狀包圍體邊緣插入的矩形闆

第二,當我們對目标點和包圍體求交時,我們需要将光線和包圍體内部的每個三角形求交,這是相對耗時的。是以,在建構球狀或膠囊狀包圍體時,我們在它們邊緣插入兩個矩形闆,而使得所有三角形面片都落在兩個矩形闆中間,如圖8所示。是以,求交時,我們首先對兩個矩形闆求交,如果和矩形闆中間部分不相交,則就可以直接判定不相交。

第三,總是要搜尋相交子集也是一個相對耗時的操作。是以,我們可以對相交子集定義一個最大度量和最小度量,即 ,隻有在實際 時,才對相交子集進行周遊。

結果與讨論

[7]渲染的陰影效果如圖9所示。圖9的上圖采用了32K32K分辨率的Shadow Map,下左圖使用了33核視窗的PCF方法來防走樣,下右圖使用了5*5核視窗的PCF方法來防走樣,從視覺上,[7]的方法可以渲染得到高清真實的陰影。

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

圖9. [7]的陰影渲染效果

[7]和其他方法的對比如圖10所示。傳統Shadow Mapping方法隻能處理16K*16K以下分辨率的陰影紋理;相比于Arvo的方法,[7]的方法不會随着分辨率的提高而效率顯著下降;相比于Sintorn的方法,在同樣的分辨率下,[7]的方法往往具有更高的效率。

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

圖10. [7]和其他方法的對比

[8]的結果和PSV以及ShadowLib的結果做了對比,其渲染效果和消耗時間如圖11顯示。可以看到[8]同樣可以對複雜場景進行陰影渲染。相比而言,[8]不太适合處理有不規則或者有大量孔洞的模型,因為Shadow Volume将把空間切得非常碎,進而消耗了更多的時間。但對于單一的表面模型,[8]的效率将高于其他方法。

簡述Shadow Mapping和Shadow Volume的新方法簡介相關工作高分辨率Shadow Mapping壓縮基于聚類和度量樹的實時陰影渲染方法度量樹建構結果與讨論參考文獻

圖11. [8]的渲染效果以及和其他方法的對比

Shadow Mapping和Shadow Volume兩種方法出發點十分簡單,符合直覺,然而随着模型複雜度的增加、對實時渲染要求的提高、對視覺效果要求的提升、以及新硬體(如更好的GPU)的出現,給原來的方法帶來了許多新的突破。兩種方法的一個共性是,在幾何空間或投影空間中,進行劃分和建樹,通過分治法的思想,來減少周遊所耗的代價。許多壓縮的算法,比如薄殼中間面的計算、四叉樹的簡化、物體三叉樹的定義、不同形狀的包圍體,都為陰影的計算和渲染起到了不同的作用。

但是,Shadow Mapping和Shadow Volume雖然在尋找光源直接産生的陰影上是精确的,且在許多場景中确實是适用的,但是,在一些材質更加複雜的場景中,比如含有能夠反射或折射的材質的場景,光的來源将不僅僅隻有光源,還有光的散射、折射和反射。這種情況下,簡單優雅的傳統方法就将失效,隻有采用基于實體的方式,才能得到更加具有真實感的渲染效果。

參考文獻

[1] G. S. Hubona, P. N. Wheeler, G. W. Shirah, and M. Brandt. The relative contributions of stereo, lighting, and background scenes in promoting 3D depth visualization. ACM Transactions on Computer-Human Interaction, 6(3):214.242, Sept. 1999.

[2] F. C. Crow. Shadow algorithms for computer graphics. Computer Graphics (SIGGRAPH '77 Proceedings), 11(2):242.248, 1977.

[3] L. Williams. Casting curved shadows on curved surfaces. Computer Graphics (SIGGRAPH '78 Proceedings), 12(3):270.274, 1978.

[4] HEIDMANN T.: Real shadows real-time.

[5] CARMACK J.: Z-fail shadow volumes.

[6] https://www.nvidia.com/docs/IO/8230/GDC2003_ShadowVolumes.pdf

[7] Scandolo, Leonardo, Pablo Bauszat, and Elmar Eisemann. “Compressed Multiresolution Hierarchies for High‐Quality Precomputed Shadows.” Computer Graphics Forum. Vol. 35. No. 2. 2016.

[8] Deves, François, et al. “Scalable real-time shadows using clustering and metric trees.” Proceedings of the Eurographics Symposium on Rendering: Experimental Ideas & Implementations. Eurographics Association, 2018.

[9] WOO A.: The shadow depth map revisited. In Graphics Gems III, Kirk D., (Ed.). Academic Press, 1992, pp. 338–342.

[10] WEISKOPF D., ERTL T.: Shadow mapping based on dual depth layers. Eurographics 2003 Short Papers (2003).

[11] ARVO J., HIRVIKORPI M.: Compressed shadow maps. Vis. Comput. 21, 3 (Apr. 2005), 125–138.

[12] RITSCHEL T., GROSCH T., KAUTZ J., MÜELLER S.: Interactive illumination with coherent shadow maps. In Proceedings of the 18th Eurographics Conference on Rendering Techniques (2007), EGSR’07, Eurographics Association, pp. 61–72.

[13] LLOYD D. B., WENDT J., GOVINDARAJU N. K., MANOCHA D.: Cc shadow volumes. In Proceedings of the Fifteenth Eurographics Conference on Rendering Techniques (2004), EGSR’04, pp. 197–205.

[14] STICH M., WÃˇDCHTER C., KELLER A.: Efficient and robust shadow volumes using hierarchical occlusion culling and geometry shaders. In GPU Gems 3. 2008, pp. 239–256.

[15] CHIN N., FEINER S.: Near real-time shadow generation using bsp trees. In Proceedings of the 16th Annual Conference on Computer Graphics and Interactive Techniques (1989), SIGGRAPH ’89, ACM, pp. 99–106.

[16] GERHARDS J., MORA F., AVENEAU L., GHAZANFARPOUR D.: Partitioned Shadow Volumes. Computer Graphics Forum, Proceedings of Eurographics 2015 (2015).

[17] EVERITT C.: Interactive order-independent transparency, 2001.

[18] AGARWAL P. K., SURI S.: Surface approximation and geometric partitions. In Proceedings of the Fifth Annual ACM-SIAM Symposium on Discrete Algorithms (1994), SODA ’94, Society for Industrial and Applied Mathematics, pp. 24–33.

[19] REEVES W. T., SALESIN D. H., COOK R. L.: Rendering antialiased shadows with depth maps. ACM Siggraph Computer Graphics 21, 4 (1987), 283–291.

[20] YIANILOS P. N.: Data structures and algorithms for nearest neighbor search in general metric spaces. In Proceedings of the Fourth Annual ACM-SIAM Symposium on Discrete Algorithms (1993), SODA ’93, pp. 311–321.

[21] UHLMANN J. K.: Satisfying general proximity / similarity queries with metric trees. Information Processing Letters 40, 4 (1991), 175 – 179.