第三章 系統實作
第一節 整合系統概述
本系統設計可分為兩大部分,第一部分是函式呼叫整合系統,負責將OpenGL API 轉接到由自己維護的函式庫內,並且蒐集使用者呼叫 OpenGL 函式後的參數
加以轉換成系統內部格式,接下來等待同步指令下達後再啟動光線追蹤的計算。
第二部分是採用了OpenCL 開發的光線追蹤繪圖程式,就如同第二章介紹 OpenCL
的段落一樣,有負責掌握運作機制的host 端以及實際執行平行化運算的 device 端。
OpenGL 應用程式使用本論文的整合系統函式庫其實非常的簡單,只需在原
始程式碼內引用一個標頭檔就可以自動將原本的程式邏輯導向到整合系統內,接
下來應用程式就會改以光線追蹤來繪製,此時應用程式的底層已不再是 OpenGL
的光柵化,而是由整合系統的光線追蹤繪製所產生的畫面。
11 支援何種版本
OpenGL 以及功能
OpenGL 3.0 版本[7]制定的規格,不再支援一指令組繪製一次圖形的用法,此
方式又稱為圖形立即繪製模式(immediate mode primitive rendering),取而代之的是
鼓勵採用 VAO (vertex array objects)和 VBO(vertex buffer objects)…等將資料放入
緩衝陣列後再一起傳遞給 OpenGL driver 藉此減少與繪圖裝置溝通的次數,可以
降低 IO 延遲並提升繪圖效率,而這樣的改變也對整合系統抽換底層從光柵化管
線(rasterization pipeline)改為光線追蹤的方法十分有利。
Legacy OpenGL 泛指的是 3.2 版本之前,程式風格以固定功能(fixed-function)
的呼叫模式為主,其中有lighting、materials、color materials、shadow mapping 和 bump mapping,優點在於過去廣泛使用的繪圖技術皆被內建在 legacy OpenGL,
但是現今 GPU 硬體架構突飛猛進,制式化的固定功能已經沒辦法滿足消費者的
口味,因此出現了shader 語言讓光柵化管線更自由地實現自定義的光影效果,另
一個原因是所有的固定功能呼叫模式所產生的效果都可以由撰寫shader 來模擬實
現,因此官方制定的規格在 OpenGL 3.2 版本以上也決定移除這些固定功能並且
要求OpenGL 程式必須提供 shader 程式才能運行。
即使如此,現今仍有一些OpenGL 應用程式採用這樣的寫法,特別是基礎計
算機圖學教學課程會介紹OpenGL 設計的演進以及技術的介紹,因此本篇論文以
整合這些固定功能呼叫模式為目標,並帶來光線追蹤為底層的繪製。
12 系統流程架構
本段落以圖 3 整合系統流程圖介紹 OpenGL 應用程式繪圖實際範例,圖中左
邊使用者程式碼可視範圍區塊代表開發者撰寫的OpenGL 程式碼,通常會包括讀 取模型檔案、訂定光源細節、設定緩衝數據資料(頂點、顏色和法向量…等)和呼叫
繪圖指令。
同時這些 OpenGL API 會被整合系統導向到內部呼叫,並且擷取其中的參數
資料作為光線追蹤前置準備,而這些動作使用者完全不用額外的操作,就像是在 執行原來程式碼一樣,此部分是圖 3 中間 API 背景執行擷取區塊對應的工作。
圖 3:整合系統流程
本論文提出的光線追蹤應用程式介面整合OpenGL 程式設計流程一覽,左邊區塊 代表常見的OpenGL 應用程式產生畫面流程,右邊區塊是光線追蹤運作的流程,
原本的光柵化會在最後同步繪圖指令的階段改以啟動光線追蹤,並將畫面結果返 還給OpenGL 顯示。
13
因為前兩個區塊相互的對應是處於同時進行的關係,但是仍有最關鍵的問題
是在流程最下方繪圖指令下達後何時該執行光線追縱,由於光柵化的特性每個繪
圖指令被呼叫時,繪圖裝置可能會立即執行也有可能在佇列狀態,換句話說場景
資料會被分段進行rendering 再根據深度測試覆蓋原本被擋到的圖形,但是光線追
蹤直到確定場景資料已經準備完成,才能開始對每個物件做交點測試計算畫面。
整合系統的設計必須考慮兩者差異性然後找出共通點來啟動光線追蹤,因此
決定以 OpenGL 用來刷新繪圖指令的 glFlush 函式作為整合系統啟動光線追蹤地
同步信號,雖然上段已提到繪圖指令執行可能有不一致行為,但現今各家廠商的
驅動設計會保證繪圖指令一定在有限時間內被排入裝置,這樣同步指令對於原本
光柵化的程式並沒有太大的影響,但對本篇論文提出的整合系統來說是最佳的同
步時機。
當OpenGL 應用程式執行了同步繪圖指令後才會真正啟動光線追蹤流程,也 就是進入如圖 3 右邊的 GPU 執行平行化任務區塊,其中光線追蹤又有更細部的
演算法流程,這部份會在第四章完整的敘述。另一方面,更新畫面緩衝這個步驟
則有比較特殊的處理,由於 OpenCL 提供了一種互通性(interoperability)機制讓其 image 型態與 OpenGL texture 型態結合再一起,代表畫面緩衝資料不用從 OpenCL
環境傳回 host 端再傳回 OpenGL 環境來顯示,而是讓處於 GPU 記憶體內的緩衝
資料直接讓OpenGL 來使用,因此可節省傳遞延遲並提升畫面更新速率。
14