他的程式檔有兩個:
volumeRender.cu
主程式、資料讀取和 OpenGL 等相關的部分。
volumeRender_kernel.cu
實際做 ray casting 的 CUDA kernel。
在 volumeRender.cu 中的 function 列表如下:
main | main function。 |
loadRawFile | 用來讀取 Volume data 的函式。 在這個範例中,Volume 的資料是用 3D 的 RAW 檔來儲的。 |
initPixelBuffer | 建立 OpenGL 的 pixel buffer object,用來對應到 CUDA ray casting 儲存結果的記憶體空間。也直接拿來畫出結果。 |
cleanup | 清理資料用的。 |
iDivUp | 做除法的無條件進位,用來算 grid 大小用的。 |
initCuda | 起始化 CUDA 的資料。 主要是把讀進來的資料建立成 3D Texture,以及建立顏色對應用的 transfer function(包含陣列資料以及 1D texture)。 |
render | 把旋轉矩陣由 host memory 複製成 device 上的 constant 變數。然後呼叫 kernel 函式,進行計算。 |
display | glut 的 callback function,用來顯示用的,每次要更新畫面,都是執行這個函式。 他會計算物體的旋轉矩陣,然後再呼叫 render() 來做 ray casting 計算,最後再把儲存了結果的 pixel buffer object 畫出來。 |
reshape motion mouse keyboard | 這四個 function 是 glut 的 callback function。 reshape 是當視窗大小位置改變時會被執行到、motion 是滑鼠移動時會被呼叫的、mouse 是滑鼠按鈕會執行的函式、keyboard 則是鍵盤的。 |
而在 volumeRender_kernel.cu 中,則是:
intersectBox | 計算一條視線和 Volume 的 box 的交點,並傳回相交的最近點和最遠點。 |
mul | 計算矩陣乘上一個向量。 |
rgbaFloatToInt | 把 rgba 四項的 color,轉換成一個 int 來儲存。 |
d_render | CUDA 的 device kernel function。 為每一個像素,用 Ray casting 的方法來計算他的顏色。 |
intersectBox計算一條視線和 Volume 的 box 的交點,並傳回相交的最近點和最遠點。
mul計算矩陣乘上一個向量。
rgbaFloatToInt把 rgba 四項的 color,轉換成一個 int 來儲存。
d_renderCUDA 的 device kernel function。
為每一個像素,用 Ray casting 的方法來計算他的顏色。
本文来自:http://heresy.spaces.live.com/blog/cns%21E0070FB8ECF9015F%213597.entry