GPU Raycasting的兩種實現方法

Raycasting的核心是從每一個屏幕像素處發射一條光纖,然後讓其穿過整個體數據。基於GPU的Raycasting可以獨立,並行地計算每條光線,從而能大大提高速度,實現實時繪製效果。繪製時的過程一般是繪製一個長方體,並且以體數據作爲三維紋理。根據光線的方向和終點的確定方法的不同,Raycasting有兩種實現:


1,基於光線起點和相機位置。將相機位置由世界座標通過模型視圖投影矩陣反變換到長方體的局部座標空間。每個fragment的座標作爲光線的起點,由變換後的相機位置與光線起點確定光線的方向,在沿着光線方向從起點前進時,每到達一個新的點,判斷其是否在長方體內,如果不在,則結束這條光線。

2,基於光線的起點和終點。事先算好了光線的起點和終點,根據這兩個點可以確定光線的方向。同時根據這兩個點之間的距離與光線前進的步長可以計算出光線上有多少個採樣點。在起點與終點之間的每一個採樣點處,不需要判斷這個點是否在長方體內。起點和終點的計算可通過幀緩衝對象(framebuffer object, FBO)來實現。


      該方法先畫兩個立方體到不同的FBO對象,將立方體的座標作爲該點的顏色,一個FBO對象中只畫出該立方體的可見面,而另一個FBO對象中只畫出該立方體的不可見面。在得到的兩個FBO對象中,每一個相對應的fragment處,其顏色rgb值分別表示了光線的起點座標和終點座標。然後這兩個FBO對象再作爲紋理,傳遞給繪製立方體的片段着色器中。

      第一種方法需要逐點判斷,比較花費時間。特別是當用戶再添加一些剪裁平面時,判斷運算特別頻繁,會導致運算速度很慢。第二種方法實際上時進行了三次繪製。但是前兩次繪製的速度很快,而第三次繪製時由於不需要再判斷光線上的各個點是否在長方體內,其運算速度也較快。當數據量很大,採樣率很高時,採用第二種方法會快得多。

     參考網址:http://www.daimi.au.dk/~trier/?page_id=98

發佈了43 篇原創文章 · 獲贊 187 · 訪問量 61萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章