第三章 技術討論
第一節 環境遮蔽演算法
過去在討論光照模型時,例如 Phong shading,我們通常都用一個常數來代表 環境光。相較起來,環境遮蔽可以讓物體的表面在環境光照射下呈現出正確的陰 型的幾何資訊,包括頂點位置、法向量及 polygon,我們以表面的法向量為中心 軸,並以此法向量為方向射出數條追蹤線,每條追蹤線則偵測是否有碰撞到場景 中的其他物體。假設所有追蹤線的數量有 N 條,偵測沒有碰到其他物體的追蹤線 有 M 條,則未遮蔽率 A = M/N,然後將未遮蔽率乘上顏色及可得到環境陰影的效
7
8
第二節 權重環境遮蔽演算法
本論文提出另一個不同做法的環境遮蔽演算法-權重環境遮蔽
(Weighted Ambient occlusion)演算法。權重環境遮蔽演算法亦是基於光跡追蹤演算 法來實現。
壹、 為什麼要使用權種環境遮蔽演算法?
環境遮蔽演算法經由計算表面接受到場景天空中的光照量並強調物體與物 體間相互遮蔽的影響,不但加強我們對場景中的深度與形狀感知,更加強了畫面 整體的立體感與品質。在環境遮蔽演算法中的天空即為整個場景的 Bounding box。
但是,當場景來到一個密閉空間,像是室內房間或是物體內,其表面經由環境遮 蔽演算法所計算出來的未遮蔽率都將會是 0。也就是說環境遮蔽追蹤線在密閉場 景中一定會測到遮蔽點,如圖 2。
可以發現,在環境遮蔽搜尋整個場景的情況下,密閉場景內部的表面無法經 由環境遮蔽演算法蒐集到環境光照,以至於無法呈現原本環境遮蔽要加強場景中 物體間相互遮蔽的陰影效果,也無法強調出空間中的形狀與深度。為了解決這個 問題,我們提出權重遮蔽演算法來呈現密閉場景中的環境遮蔽效果。
9
10
圖 3
橘色的半圓為環境遮蔽範圍 R,擊中距離為 Ɩ。權重環境遮蔽利用 R 與 Ɩ 來決定每 個面的遮蔽量。
第三節 模擬間接光照
SSDO 中提出利用 screen space 的環境遮蔽演算法來模擬間接照明。而我們利 用光跡追蹤的環境遮蔽演算法來模擬間接光照的效果。
做法是利用環境遮蔽追蹤線擊中遮蔽面時判斷遮蔽面的法向量與光源的位 置來決定此面是否有間接光照影響。如圖 4。當偵測到的遮蔽面的法向量與光源 在同一方向,則此遮蔽面會給予提供光源的間接光反射效果;若是與光源在照射 不到的方向,則只存在遮蔽的效果。
11
圖 4
利用遮蔽點 A、B、C 及 D 的法向量與光源方向做判斷來決定間接光照的效果。
A 與 D 點對 p 點提供間接光的影響;B 點與 C 點則無。
第四節 OpenCL
OpenCL 是一開放性計算語言,由各大廠商所共同制定規範標準的一個可以 在異構式平台上運作的程式語言。在 OpenCL中主要提供兩種平行化計算的模式,
分別為資料平行(data parallel)與任務平行(task parallel)。光跡追蹤演算法屬於前者,
主要以資料平行運算為主。
壹、 架構
在 OpenCL 平台(Platfoem)中是由主機(Host)與裝置(Device)所構成。程式由主 機端開始執行,接著將工作交給裝置計算,最後再由主機端結束程式。所有的計 算裝置和計算資源也都由主機端管理。
OpenCL 的程式分為兩個部分,分別為主機上的主程式(Host program)與在裝 置上執行的內核程式(Kernel program)。內核程式由主機端編譯執行,亦由主機端
12
控制各個內核程式的執行順序。
貳、 OpenCL 與光跡追蹤
在光跡追蹤演算法中,每一個像素所需要處理的工作與任務都具有獨立性。
因此平行運算非常適合應用在光跡追蹤演算法上。這裡我們讓 OpenCL 將每一個 像素的工作指派給一個 work-item 來做,其中每個 work-item 皆是獨立平行執行。
最後再將結果傳回繪出。
13