第一章 緒論
1.4 論文章節架構
國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
3
以單一物體四次折射架構,延伸至多物體的場景,進行多物體四次折射 計算。
1.4 論文章節架構
在第二章中,我們將會介紹與本研究相關的研究背景知識,重真實世界光學 的物理現象到光跡追蹤的演算法,以及對光學的分析,此外也介紹我們主要參考 的技術:depth peeling、texture mapping、relief mapping 算法。在第三章當中則是 主要的研究方法與步驟,針對單一物體分層後的結果,並考慮深度斷層的結果,
此外我們也提出多個物體的折射算法。在第四章則是實驗結果的呈現與分析比較 討論。第五章是結論與未來研究。
‧
術,在 2.3 節討論 image space 的相關研究。另外我們的方法運用了 depth peeling 技術來切割我們的模型,在 2.4 節我們討論 depth peeling 技術以利於我們計算折‧
全內反射(Total internal reflection)是一種光學現象。當光線經過兩 個不同折射率的介質時,部份的光線會於介質的界面被折射,其餘的則被反射。
但是,當入射角比臨界角大時,光線會停止進入另一介面,並且全部向內面反射。
這只會發生在當光線從光密介質(較高折射率的介質)進入到光疏介質(較 低折射率的介質)並且入射角大於臨界角時。因為沒有折射(折射光線消失)而 都是反射,故稱之為全內反射。例如當光線從玻璃進入空氣時會發生,但當光線
‧
Ray tracing(光線追蹤),是幾何光學中一項基本的技術,透過跟蹤與光學表 面發生互動作用的光線從而得到光線經過的路徑。也常用於生活中,如照相機,
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
7
圖 2.3: ray tracing
而在電腦圖學中,運用 ray tracing 所繪製的 3D 物體如圖 3.3a:單純只有折射 的 render,黑色的部分是因為全反射的產生而造成無法顯示折射,b 則為加入全 反射後的 render,c 為場景設計。
圖 2.4: ray tracing 折射與全內反射比較(a)只有折射的結果(b)加入全反射後的結 果 (c)場景設計。
對於每一個 pixel 都產生一條 view ray
如果與最相近的物體相交則設置此物體為最近物體並記錄最近距離。
對每個 view ray 射出一條 shadow ray 來檢測是否處在陰影中。
如果表面是反射面,生成反射光;對此反射光繼續遞迴。
如果表面透明,生成折射光;對此折射光繼續遞迴。
使用最近物體和最近距離來計算指像素的色彩。
(a) (b) (c)
‧
而近年 NVIDIA 發表了“互動光線追踪引擎”OptiX (OptiX Application Acceleration Engine)。OptiX 是以 CUDA(Compute Unified Device Architecture)的 架構,可以使用 C 語言編寫程式,繪製出以 GPU 運算的光線追踪的場景。OptiX 的結果相對越不明顯,Yasuhiro 在 2010 年 CVPR 發表 [Yasuhiro, 2010],其中分 析光的強度如圖 2.6,我們可以發現,光線經過四次的作用之後其強度已經不明 顯,其原因在於光線經過物體的折射反射與散射之後其能量會漸漸被物體給吸收,
此外 Aner 在 2008 年 ACM TOG 發表[Aner, 2008]中也提到四次光學作用是他們 認為最佳的光學效果。
圖 2.5: Light Path(線條),縱軸(光強度),橫軸(光焦距),摘自 [Yasuhiro, 2010]
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
9
Manmohan 在 2011 年 IEEE TPAMI 發表的[Manmohan, 2011]更精準的分析 當前光學的運算方法:”逆向光線傳輸”,其結果如圖 2.6,顯示了 light pass 的次數 越大結果越黑。因此在我們的方法中,我們也以分為四層的物體,最多產生四次 折射為基礎。
圖 2.6: Light Path 次數與顯示結果,摘自[Manmohan, 2011]
2.3 Texture mapping 技術與 Shader
Fabio 在 2005 年 I3D 發表[Fabio, 2005],他的方法需要模型的高度場與法向 量,以“光線高度場相交”演算法有效率的產生任意模型上的立體表面,由於 [Manuel, 2007]的方法在計算折射交點時便是以使方法為基礎,因此我們在此仔 細說明此演算法。
圖 2.7: relief mapping,摘自[Fabio, 2005]
‧
2.把 VD 轉換到切線空間(tangent space)(定義為切線、法向量和次法 向量組成的向量);
3.從 VD'(轉換過的 VD)和 A、貼圖座標(s,t) ,直到計算到 B,貼圖座 標(u,v),這個位置已經到了深度值是 1.0 的地方(圖 2.6);
4.使用 A 和 B 之間的二分搜尋來計算 VD' 和高度域表面的相交點;
5.使用計算出來的相交點的貼圖座標來繪製每一個 frangement 的屬性
(比如:法向量、深度、顏色,等等)
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
11
然而這個演算法也有問題的存在,如果視線與高度域表面相交不止一個點的 時候,二分搜尋的方法就可能會帶來不正確的結果,如下圖。在這個例子裡,第 一次找到的中點對應的深度值要比深度圖中實際的深度值小。這個時候用二分搜 尋會繼續找到圈 3 這個相交點,這顯然是錯誤的。為了避免錯過第一次相交,
我們使用線形搜尋的方式來處理。從點 A 開始,我們沿著線段 AB 每次增加 d 的 距離,直到找到在表面內的第一個點(圖 2.9 左)。
圖 2.9: 左:二分搜尋的錯誤,右:線性搜尋
至於背景我們採用[Fernando, 2003]的方法建構 environment mapping,以下為 步驟:1、根據視線方向和法向量計算反射向量;2、使用反射向量或折射向量檢 索環境貼圖得到貼圖;3、將貼圖融合到當前像素中。
圖 2.10: environment mapping 示意圖,摘自[Fernando, 2003]
‧
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 點,主要公式為:
p̃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 後存成貼圖方便
Render to texture 是常用的一項基本的繪圖技術,顧名思義就是把 render 目 標從 frame buffer 變成一個貼圖。這樣就可以把一個場景 render 後存成貼圖方便