• 沒有找到結果。

3-1 概要

光傳遞容積( Light Propagation Volume,簡稱 LPV )的運算部分主要可以分 為幾個階段,下圖為階段流程概要圖:

圖5 LPV 主要流程概要 [10] [6]

首先會將整個場景分割為固定等分的容積體( volume ),容積體皆為正立方 體,容積體中心即為儲存光照資訊的邏輯位置,進行以下步驟:

1. 在場景中加入虛擬點光源( virtual point light,簡稱 VPL )資 訊,如圖 5 (A)。並讓各個擁有 VPL 的容積體則採樣在該容積 的 VPL 資訊作為間接照明資訊,如圖 5 (B)

2. 將光照資訊傳遞至相鄰容積體,如圖 5 (C)

3. 容積體內資訊皆利用球諧函數( spherical harmonics,簡稱 SH ) 壓縮間接照明資訊,SH 基底示意如圖 5 (D)

11

4. 最後採用可視點所在的容積體間接照明資訊(圖 5 (E) )再加上 直接照明資訊成為結果(圖 5 (F) )

3-2 球諧函數( Spherical Harmonics )

1球諧函數為定義在球座標系的無限項函數集合,其各項互為正交函數,如 將任一向量以球型參數( spherical parameter )表示為:

𝜔⃗⃗ = (sin 𝜃 cos 𝜑 , sin 𝜃 sin 𝜑 , cos 𝜃)

12

圖6 球諧函數定義 [11]

在 3D 空間中,𝑦𝑙𝑚的值對應於各方向的單位向量,呈現的圖形則為下圖:

圖7 向量對應球諧函數圖形 [6]

圖中代表將各方向單位向量帶入球諧函數後,得到的𝑦𝑙𝑚值:𝑦𝑙𝑚的大小為原點至 圖形表面之距離、綠色代表正數、紅色代表負數。球諧函數為無限項集合,此

圖僅例舉0 ≤ 𝑙 ≤ 4

13

3-3 球諧用於近似光照分布

在 [6]中,透過正交基底的線性組合性值得知,要將某光照分布函數轉換以 SH 表示,對應至𝑦𝑙𝑚項的係數為:

𝑐𝑙𝑚 = ∮ 𝑓(𝑠)𝑦𝑙𝑚(𝑠) 𝑑𝑠

其中𝑓(𝑠)為光照分布在𝑠方向的強度,而𝑦𝑙𝑚(𝑠)則為用𝑠方向取得 SH 頻率為𝑙 的值。因此在還原時,僅需要將無限項的係數𝑐𝑙𝑚乘上𝑦𝑙𝑚(𝑠)理論上即可還原原始 的函數分布,但如果只採樣有限頻率至𝑙 = 𝑛 − 1項,則僅能近似原始分布函 數:

𝑓(𝑠) ≅ 𝑓 ̃ (𝑠) = ∑ ∑ 𝑐𝑙𝑚𝑦𝑙𝑚(𝑠)

𝑙

𝑚=−𝑙 𝑛−1

𝑙=0

= ∑ 𝑐𝑖𝑦𝑖(𝑠)

𝑛2

𝑖=0

其中𝑓 ̃ (𝑠)為近似後的分布函數。因此使用越多項球諧函數,則越能夠近似 原始光照分布,如下圖所示:

圖8 以 SH 近似分布函數範例 [6]

14

3-4 初始光照資訊及虛擬點光源

進行 LPV 運算的第一步,以 2-2 介紹的 RSM 在場景範圍內放入若干個

VPL,其作法與陰影映射圖類似。VPL 就是假設會產生間接照明的虛擬光源,

因此代表兩個意義:

1. 虛擬點光源所在的位置都有直接照明效果,即非陰影區域 2. 虛擬點光源會所在的場景物體會產生間接照明

雖與陰影映射類似,但儲存的資訊除了用於陰影映射的深度外,仍然需要

VPL 的其他資訊,如:強度、顏色、輻射方向及位置。

圖9 虛擬點光源及預想輻射方向 [10]

採樣間接貢獻時,輻射方向是假設為漫射的均勻分布

在採樣虛擬點光源資訊時,假設處理的表面皆為漫射性反射表面,因此輻 射方向應為均勻分布 (如圖 9 ),之後會使用有限項 SH 進行壓縮,因壓縮產生的 誤差,即可產生接近漫射的分布,因此在進行 VPL 採樣以通常以所在的平面法 向量為輻射方向。

15

圖10將光照分布植入容積體 [10]

將圖9 的採樣資訊加入所在位置的容積體,此時容積體儲存的已經是利用 SH 近 似照明分布的係數

由於在實作層面,儲存各方向的光照分布將會使用掉相當大量的儲存資

源,相較之下如使用頻率至𝑛 − 1的 SH 來近似分布函數,則只要儲存𝑛2個對應 係數,且使用低頻 SH 近似後,誤差可產生漫射的類似效果;同時由於低頻 SH 的還原運算(係數相乘累加)相當快速,因此能夠相當有效率地將原始光照強度還 原。

在 [2]中提到,通常在實作實作 LPV 時,也要考慮到光源移動依然要相當 快地更新 LPV 中的資訊,因此通常 SH 係數只會取到𝑙 = 1或𝑙 = 2的係數項,也

就是總共會有𝑛2 = 4或𝑛2 = 9項係數。

3-5 傳遞間接照明資訊

經過 3-4 的第一步驟,所有包含 VPL 的容積體都已經有了間接照明的資 訊,接下來要將間接照明資訊傳遞給相臨的六個容積體,使得場景中的容積體 能夠提供正確的間接照明給任一採樣的可視點。

16

圖11將 SH 係數傳導至相臨的容積體 [10]

傳導至相臨容積體的方式,將針對相臨容積,除了相鄰面以外的五個面進 行貢獻還原,然後再以相鄰容積體的中心採樣還原。在實作上我們採用對於五 個面中心點的方向為還原及重新採樣方向,以還原方向的貢獻度當作對還原面 的貢獻度。

圖12 LPV 傳導方法 [2]

12 表示將貢獻值由灰色容積體傳遞至綠色容積體的概略方法,左為還原,右 為重新映射壓縮

由於以對於面中心的貢獻,當作對整面的貢獻(如圖 12 左),在理論上和連

續的貢獻度積分不同(圖 12 的V(ω)用來表達對面 f 的總貢獻度 ),所以還會再乘 上一個針對各個面的比重,修正這個比重造成傳遞的誤差,同時製造因距離而 發散、減弱的間接照明效果。

還原針對各個面的貢獻後,會再將各個面當作輻射方向(圖 12 右𝑛𝑙為舉例以 面 f 作為輻射方向時),並依各平面的貢獻度,以 3-3 的方式壓縮為 SH 係數,並

17

將係數存於所屬的容積體資料中(圖 12 右的𝐼𝑙(𝜔)表示還原後應有的貢獻度)。以 此類推,多次傳遞後則可將資訊擴散至各個容積體中。

3-6 採樣可視區域的全域照明

最後在進行可視圖繪製時,所有的可視點將取來自其所屬的容積體中,對 該方向的貢獻度,乘上所希望的間接照明比重成為間接照明。再加上直接照明 後,乘上物件原本的顏色,則可獲得所期待的全域照明效果。

圖13 Sponza 場景的間接照明

左為Sponza 場景的間接照明效果,就算還沒加入直接照明,在離 VPL 距離近的 容積量度依然較高;中為直接照明的效果,暗部完全不會受到周遭反射的影

響;右為結合直接照明及間接照明的全域照明效果

18 算設計。但由於近年已可見一些以 WebGL 提供虛擬實境(virtual reality,簡稱

VR)裝置的例子,且以 OpenGL 4.0 為環境進行實驗,仍然採取以頂點著色器 ( vertex shader )與片段著色器( fragment shader ),並使用 OpenGL 的繪製至貼圖 ( render to texture )功能,進行計算的平行化處理。

圖14以繪製至貼圖功能平行運算的設定 使用特定設計來控制斷片著色器的觸發頻率

為了達成利用繪製至貼圖功能進行平行化,對於頂點( vertex )及視框緩存

( framebuffer )資料使用一些特定的設計。

FRAMEBUFFER OBJECT

Width: w Height: h

Depth Attachment Color Attachment h Texture Coordinates:

(1, 0), (0, 1), (1, 1), (0, 0)

Setup for Parallel Calculation using Fragment Shader

h

w w

h

相關文件