2.1 光跡追蹤 Ray Tracing
光線追蹤(Ray tracing),是一個描述光線與物理表面所發生的互動行為而取 得其路徑的方式。在早些年代光線追蹤並不是電腦圖學領域的專有名詞,像是一 些光學鏡片產生的效果如相機,望遠鏡,眼鏡等都是運用其物理上的原理所構成。
但是在電腦圖學上來說,這是一種成像構圖的演算法,藉由追蹤眼睛發射出來的 光線,去掃描範圍內所放置的物體並顯示出來的數學模型,很特別的是光並不是 從光源去追蹤,是因為中就成像的圖像就是眼睛的位置,為了確保每條光都是有 意義的不會白費運算時間,使用反向的追蹤反而是比較有效率的做法,而光追蹤 可以做出許多光學效果,許多高品質的效果都是 OpenGL 難以辦到的,因此要追 求高畫質的三維影像常常使用這種方法來執行。
現實生活中的光線,以物理學的觀點,是追蹤光在不同介質間傳播的情形,
由於不同物體本身的屬性,使其可以產生各種的物理現象,例如說光被吸收,反 射出去,或是改變行徑方向等。。。,當然在計算機圖學上不太可能用太複雜的 物理公式去模擬光的行為,因此會簡化光線通過介質產生的反射折射陰影之類來 解決許多較為複雜的狀況。
因此在計算機圖學的光線追蹤運算方法,主要是把光線理想化成一個單一的 向量線,並且透過光線追蹤期在各種不同物體上的反映情況做處理。首先打出一 條光線,並且開始測試各個可能被光線射中的物體,取得最近距離的集中點位置 以及其物體屬性,依據不同參數的設定決定是否會產生反射折射的現象而產生出
新的光線,取得其傳播路徑與其傳播圖中所經過的物體的顏色資訊,最後在計算 出最終的顏色投射在視網膜上。
圖 1.光追蹤演算法示意圖
2.2 基礎演算法分析
光線追蹤並不是一個非常新穎的技術,在此參考了被廣泛使用的光追蹤演算 法的寫法如下,由此演算法為基礎來分析光追蹤演算法是否有機會使用平行化增 強其效能.
經典光線追蹤演算法流程:
適合做為平行處理。
光線追蹤在 OpenCL 實作的缺點分析:
然而 OpenCL 的 kernel 程式是無法執行遞迴處理,而且程式限制所有的分流 都需要一開始決定好,不可以在 kernel 端中再 fork 出新的分流核心,因此在設 計上不能使用以上的架構,如果要製作反射折射的設計就要另外做處理,而且雖 然 OpenCL 提供了平行化的良好設計但是記憶體的流程反而是最重要的課題,由 於記憶體與 host 端並不是完全可以互相使用,還是要經過額外傳輸或是宣告的 處理才能使用,並且在大小限制上也比 C 程式還要多,但是還是有其使用上的 限制會使其無法達到其最大的效能,是要在撰寫程式時需要有許多留意的地方。