• 沒有找到結果。

第二章 相關研究

2.5 折射

Depth peeling(深度剝離)是為了處理透明物體的繪製而發明的技術,原始的 版本可以在 NVIDIA Developer 網站上找到。depth peeling 是基於 z-buffer 的多層 深度繪製,每一層的深度是基於上一層繪製的深度值基礎上進行的。它是由 Mamman 1989 年中提出[Mamman, 1989]。 Everitt 在 2001 年 [Everitt, 2001]給出 該方法在 GPU 上的實作。在這之後,該方法得到大量的應用。Baoquan Liu 和 Liyi Wei 在 2006 年提出[Baoquan, 2006],使用了 GPU 的 MRT(Multi render target) 能力加速生成深度剝離圖層,比原始方法提高了一倍左右的效率。而在 2008 年 Nvidia SDK 给出了 dual depth peeling 的實現[Bavoil, 2008],也就是前後深度 peeling 的技術進而提升效率。

圖 2.11: dual depth peeling,圖中顏色使觀察者明顯看出前後層,摘自[Louis, 2008]

2.5 折射

Wyman 在 2005 提出”An Approximate Image-Space Approach for Interactive Refraction”主要是以 image space 方法產生折射的效果,實作在 GPU 上。此篇的 方法比起一般光跡追蹤的方法運算較容易且適合在 GPU 上實作,但是也有缺點:

當第三次折射發生時,就會產生問題,因為法向量與高度場無法正確的顯示類似 茶壺這種拓樸結構,因此對於 3 次以上的折射會產生無法精確展示模型的問題。

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

13

圖 2.12: 茶壺折射模型,摘自[Wyman, 2005]

以下為[Wyman 2005]主要的公式算法

由 P1 點以估計的方法估算到 p2 點,主要公式為:

2 = p1 + d̃T⃗⃗ 1 ≈ p1+ dT⃗⃗ 1 其中 d 的算法則是以 dn 與 dv 的內插估計:

d̃ =θt

θidv⃗⃗ + (1 −θt θi)dN⃗⃗

得到 p2 點之後再取得 p2 點的視點入射向量、法向量,算出其射出方向得到 估計的折射路徑,產生出折射的現象。

圖 2.13: 折射技術的比較 a.摘自[ Wyman, 2005] b. 光跡追蹤法

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

14

在[Wyman,2005]之後,Wyman 緊接著發表了[Wyman, 2005],也就是透明物 體後的幾何模型如何顯示,因為原本的方法只能讀取到環境貼圖的顏色,並無法 知曉後面的模型,因此 Wyman 將模型以貼圖的方式記錄其顏色並以物體折射後 的向量計算與貼圖的距離來得到模型的顏色。

圖 2.14: a. 一層折射與後面的模型 b. 二層折射與後面的模型,摘自[Wyman, 2005]c. 光跡追蹤法

相較於[Wyman, 2005],Manuel 在 2007 提出[Manuel, 2007]是以 image space 所做出的折射效果,最大的貢獻是可變物體的折射,主要的技術是運用了 relief mapping 的搜尋方式去尋找折射的交點,因此他修正[Wyman, 2005]估計上可能產 生的錯誤。

圖 2.15: a. 光跡追蹤法 b. 摘自[Manuel, 2007] c. deformable objects

而 Charles 在 2011 提出[Charles, 2011]則是更改傳統的光跡追蹤方法,運用 BTDF 與 cone tracing 製造出即時的折射效果,另外表面也可以依照使用者輸入

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

15 的參數調整粗糙程度,變換不同的折射效果。

圖 2.16: 不同粗糙表面的折射,右邊為表面越粗糙,摘自[Charles, 2011]

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

17 下證明凸多面體只會產生二次折射:

凸多面體不會產生內角大於 180 度的形狀,如圖 3.1 為凹多面體的某一條 eye ray 的平行切面,因此我們利用反證法證明凹多面體可能會產生多次折射,得證 凸多面體必定只會產生二次折射。

圖 3.1: 任意凹多面體的某一切面

圖 3.2 為詳細的折射角度示意圖,K、L 為邊的延伸向量 N 為第二次折射向 量交點的法向量,角度 A 與 B 分別為第二次折射向量的內角與 K、L 的外角,

當 B 角度大於 A 角度時,基於角度的定理 R 與 L 只會相交一點且 R 與 K 必定相 交,因此第二次折射向量必定會與 K 向量的平面相交而再次進入模型中。

圖 3.2: 任意凹多邊形的折射

經由以上推論之後,凸多面體的模型均可以運用[Manuel, 2007]的方法來得 到正確的折射向量,然而凹多面體卻沒有辦法,而我們觀察發現凹多面體內角大

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

18

於 180 度的地方往往也是 Depth pelling 所分割 layer 之處,因此我們採用了 Depth pelling 的技術來解決複雜模型的折射。

3.1.2 層數的分析

接著所產生的問題是:要切幾層才能表現出結果?,切太少層會失去許多的細 節,切太多層又會增加不必要的計算,在[Manmohan, 2011]、[Yasuhiro, 2010]、

[Aner ,2008]三篇論文中都對光線的行進路徑進行了分析,我們發現經過四次 pass 之後的光線強度大都不太明顯,在本論文中我們特別針對光的折射路徑進行分析,

發現一般模型會產生兩次以上折射多半如甜甜圈模型的拓撲結構,又或者如動物 耳朵的形狀容易在側面的角度產生四次的折射,以玻璃(折射率=1.45)的甜甜圈模 型為例如圖 3.3,可以很明顯看出後面的柱狀體,然而也有如中國龍模型這種模 型需要到六層或八層的折射但也因為太過複雜,隨這折射次數的增加結果也漸漸 不明顯,因此如圖 3.4 所示在 OptiX render 的結果四層折射與六層折射結果非常 接近,也因此本論文最後採用四層折射的結果可以顯示大致上相似,卻也不至於 損失太多的細節。

圖 3.3: 甜甜圈模型 Blender render 結果

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

19

圖 3.4: OptiX 中國龍模型四層(左)與六層(右)結果比較,圓圈為差異處

3.2 程式架構

本節為我們方法的程式架構,首先對每一個輸入的模型進行 Depth peeling 的分層與合併,得到四層的法向量與深度,以此資料進行每層進行折射交點的計 算,計算之後的結果已貼圖的方式傳給下一個模型進行多個模型的折射。

圖 3.5: 單一物體折射程式架構

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

20

圖 3.6: 多物體折射程式架構

3.3 Render to texture 與光線相交演算法

Render to texture 是常用的一項基本的繪圖技術,顧名思義就是把 render 目 標從 frame buffer 變成一個貼圖。這樣就可以把一個場景 render 後存成貼圖方便 讀取,做出各種特效。而本論文在利用 GPU 做計算的時候也通過 render to texture 和 GPU 交換數據。

其技術關鍵在於 OpenGL 3.0 之後的版本,提供了一種預設不常顯示的 frame buffer 對象的界面。為了和原本 OpenGL 預設的 frame buffer 產生區別,這種 frame buffer 以物件的方式來表示。通過使用 frame buffer object(FBO),OpenGL 可以 將 render 的結果輸出到 FBO,而不是傳統的 OpenGL 預設的 frame buffer。

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

21

圖 3.7: 將茶壺以 render to texture,並貼圖到立方體上

在 render to texture 的技術之下,我們可以使 relief mapping 所使用的光線相 交演算法得以提升效率,首先說明 Relief mapping 運用在折射中的方法:

在[Fabio 2005]所提到的光線高度場相交演算法是 relief mapping 的核心演算 法。而在[Manuel 2007]中提出了運用光線高度場相交演算法來搜尋兩次折射向量 與物體的的交點。

首先,以視點位置得出 frustum,以此 frustum 得出 Zmin,再以深度資訊得 到 Zmax,作為之後查詢的深度 range。

圖 3.8: Zmin 與 Zmax 求法[Manuel, 2007]

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

22

有了查詢的 range 之後,以 T1(第一次折射後之向量)正規化之向量為基底求 得與 Zmin 和 Zmax 相交的 S, E 位置:

S = P1 + (Zmin − Zp1)( T1̂/ T1̂.z), E = P1 + (Zmax − Zp1)( T1̂/ T1̂.z) 再用插值公式,找出

𝑆𝐸→ 中的點,及運用 relief mapping 的搜尋方式更精確地 找到 P2(如下圖)

圖 3.9: 搜尋 P2 的方法[Manuel, 2007]

我們使用 GLSL 實作[Manuel 2007],運用高度場與法向量資訊,求得正確的 折射向量,並將所得的折射向量帶入環境貼圖,得到正確的折射影像。

圖 3.10: 以 glsl 實作兩層折射

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

23

3.4 四層深度拆解

本論文採用了 2008 年 NVIDIA depth peeling 實作中由近到遠的剝離方法,

主要概念就是對於每一個 fragment 比較剝離後的深度貼圖的深度值與當前 fragment 的深度,當 fragment 深度>=深度圖深度時即剝離,如圖 3.10(左),而比 深度圖深度小的則保留做為下一層的剝離深度圖如圖 3.10(右)。實作部份,我們 在得到深度值得同時也記錄法向量的值,結果如圖 3.10。

圖 3.11: depth peeling 示意圖(左) 甜甜圈模型為例的分層(右) 演算法如下:

//初始化第一層深度剝離的深度圖 For(深度剝離的層數)

//比較當前 fragment 與深度圖的深度 Fragment 深度>=深度圖 ->剝離

fragment 深度<深度圖 ->保留並記錄深度成為下一層的深度圖

glsl 的 fragment shader:

uniform samplerRECT DepthTex;

void main(void) {

float frontDepth = textureRect(DepthTex, gl_FragCoord.xy).r;

if (gl_FragCoord.z <= frontDepth) { discard;

}

gl_FragColor = vec4(gl_FragCoord.z, gl_FragCoord.z, gl_FragCoord.z, 1.0);

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

25

3.5.1 斷層處理

擁有了四層的深度之後我們可以一、二層深度做光線相交算法再把結果與第 三層做相交算法,最後再做第四層,然而由於內部深度會因為 3D 物體的形狀而 有斷層的產生,如圖 3.13 紅色的部分即為甜甜圈模型在第二層深度產生斷層的 地方。由於光線相交的演算法是以深度的大小來判斷其交點,因此斷層的出現,

會造成判斷上的錯誤。

(a) (b)

圖 3.13: (a) 環形模型不產生斷層的角度 (b) 環形模型第二層深度產生斷層處

因此我們提出對於斷層深度處理的光線相交演算法,首先我們觀察發現,折 射向量進入 3D model 後會被斷層所影響的情形有三種:

定義: 折射向量 T,光線相交算法線性搜尋 step 的長度為 SIZE,搜尋到的 深度比深度貼圖深度還小者差值為+,反之為−。

圖 3.14: 物體紅色實線為產生斷層的深度,黑色虛線為物體的輪廓

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

26 Case1:折射向量經過斷層的上方且不與之相交

此種情況下線性搜尋的前一個點與後一個點的深度雖然因為斷層而造成深 度與深度貼圖的差值有劇烈變化,但因為差值還是為+。因此繼續線性搜尋,如 圖 3.14。

(a) (b)

圖 3.15: (a) 3D model 產生的斷層 case1,T 為折射向量,(b) 以 bunny 為例 Case2:折射向量經過斷層中間且不與之相交

此種情況下線性搜尋的前一個點的差值為+,後一個點的差值為-,因此線性 搜尋判斷停止,如圖 3.15(左),接著進行二元搜尋,在搜尋時分別記錄最後一次 搜尋到差值為+與-的深度,當二元搜尋結束時比較最後一次搜尋到+與-的深度貼 圖深度,兩者差值必定會大於 size 的值,如圖 3.15(右)。

(a) (b)

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

27 (c)

圖 3.16: (a) 3D model 產生的斷層 case2,(b) T 為折射向量 (右)二元搜尋(c) 以 bunny 為例

Case3 折射向量經過斷層且與之相交

此種情況下線性搜尋的前一個點的差值為+後一個點的差值為-,因此線性搜 尋判斷停止,如圖 3.16(左),接著進行二元搜尋,在搜尋時分別記錄最後一次搜 尋到差值為+與-的深度,當二元搜尋結束時比較最後一次搜尋到+與-的深度貼圖 深度,兩者差值在大部分的情況下小於 size 的值,如圖 3.16(右)。

(a) (b)

‧ 國

立 政 治 大 學

Na tiona

l Ch engchi University

28 (c)

圖 3.17: (a) 3D model 產生的斷層,case3 (b) 二元搜尋,(c) 以 bunny 為例

分析 case2 與 case3 之差別處在於二元搜尋時 case2 會逼近斷層處,而 case3 則是交點處,因此可以產生區別。

Case3 二元搜尋後兩者差值在大部分的情況下會大於 SIZE 的值,也就是說,

會有特例的情況,如圖 3.18,最後的深度圖差值>size,解決的方法就只有增加 二元搜尋的次數或者將 size 的值調整變小。

圖 3.18: case3 的特例

Case2 由於判斷線性搜尋停止但實際上並未停止,因此我們需要額外的 flag

Case2 由於判斷線性搜尋停止但實際上並未停止,因此我們需要額外的 flag

相關文件