這篇文章是關於氣象局的乙個專案,寫出來旨在總結一下自己兩個月的勞動成果,同時也寫寫東西,畢竟很久沒寫東西了,表達能力也有退化之嫌。不多廢話,直奔主題。
基於gpu的三維氣象資料顯示,這個題目已經定義了這個專案執行的硬體要求以及顯示的主要內容。先來說說氣象局提供的一些資料格式,其實說來也很簡單,就是500*400*20的網格資料,每個網格資料的格式是unsigned byte,用計算機圖形學的概念來說,就是乙個500*400*20的三維紋理。相信每個接觸過圖形程式設計的人都會了解二維紋理,但對三維紋理不一定有足夠的了解。就氣象局的這個資料來說,就是乙個由20張500*400的二維紋理疊加起來的三維紋理。
上圖是乙個由4層二維紋理組成的三維紋理。介紹完三維紋理的概念,接下來介紹一下三維紋理的顯示的一些技術,要把乙個三維紋理完整的現實出來,主要有兩種體渲染(volume rendering)技術,一種是基於切片(slice)的顯示方式,另一種是基於光線跟蹤的顯示方式。本文使用後者,基本原理:由視點(觀察者位置)向要計算顏色的當前
畫素發出一條光線(向量),如果該光線與三維紋理有交點,證明光線進入三維紋理,就從該交點開始,等距獲取三維紋理與光線相交部分的值,然後按照某種方式把這些值疊加起來,作為當前畫素的顏色值。
上圖簡單顯示了光線跟蹤體渲染的原理,圓心處是視點,圖中矩形就是三維紋理,但嚴格來說三維紋理應該是個立方體,上圖並沒有體現出來。
講完必要的技術原理,下面來說說本專案具體的渲染實現。運用的圖形api為opengl,在加上cg(c for graphic)語言,當然我覺得如果懂glsl更好,畢竟glsl與硬體無關,而cg是nvidia的,在nvidia系顯示卡與非nvidia顯示卡執行的效率的差距是擺在那兒的。
首先是三位紋理的生成,
gltexparameteri(gl_texture_3d, gl_texture_mag_filter, gl_linear); // 啟用三線性過濾,以得到更加清晰的影象
gltexparameteri(gl_texture_3d, gl_texture_min_filter, gl_linear);
glteximage3dext(gl_texture_3d, 0, gl_rgba, width, height, depth, 0, gl_rgba, gl_unsigned_byte, data);
注意第三個函式的第三個和第八個引數均為gl_rgba,這是因為我們的三維紋理的每個網格點都由四個unsigned byte組成,對應opengl裡面的r/g/b/a,其中a儲存了該網格點的氣象資料,r/g/b儲存了我們計算出來的梯度值,梯度值的作用主要是用來計算光照值,在這裡就不詳細討論了。上面三個函式的前兩個是控制三維紋理放大縮小時運用的插值和取樣演算法,演算法由顯示卡驅動所提供。這裡運用了三線性插值演算法。
接下來就是確定光線(向量),首先我們來說說**立方體(proxy volume),以我的理解,我們在世界空間建立乙個立方體來**我們的三維紋理,每次繪製的時候,首先繪製立方體的背面,將其儲存在幀緩衝物件(fbo)之中,儲存成紋理,如下圖右示。
然後在幀緩衝直接繪製立方體的正面,然後把剛儲存的幀緩衝紋理傳到pixel shader之中, 接下來的工作都是在pixel shader裡面完成。注意這裡用了一些小技巧,我們確定光線跟立方體的交點是通過繪製立方體正面時賦予的紋理座標來確定的,紋理座標的範圍是0-1之間,而光線的終點是根據畫立方體的背面是的顏色值來確定的,如上圖所示,顏色的範圍也是0-1。有了起點和終點,光線的向量隨之確定。光線每次取樣的距離就可以根據使用者的需要而定了,當然,取樣距離越小,效率就越低。程式實際效果如下圖所示,
當然我們可以在pixel shader裡面做隨心所欲的東西,shader除了不能除錯之外,幾乎是萬能的,哈哈!上圖已經加了光照。由於本人表達能力有限,時間更有限,很多細節地方都沒有涉及,以後有時間再補充完整。牛人儘管發表意見,謝不吝賜教。
三維顯示的庫
1.vtk 三維顯示 2.opengl 三維顯示 3.pcl 點雲計算 最終選擇 vtk三維顯示 pcl點雲計算 最終選擇 pcl三維顯示 點雲計算 vtk是opengl的上層建築 vtk支援gl介面.他們兩個比較效能是不對的.這問題沒有意義.就跟問 windows和c 那個效率高一樣無意義.當然是...
顯示三維點雲 三維雷射點雲資料建模
三維雷射點雲資料建模 常見的建模軟體有3dmax cad 草圖大師 revit等,在規則模型建模中,我們常會用到3dmax建模,在這裡就以3dmax為例來說明其在點雲建模應用的經驗 首先我們需要將採集到的點雲資料的原始格式轉換成autodesk軟體可以利用的rcs檔案,轉換工具就是recap或者re...
基於google earth 高程資料三維地形建模
最近看了看三維圖形影象方面的一些資料,以及一些三維地形建模的文章。做了乙個三維地形建模的程式。三維地形的應用範圍比較廣,可以做地質測量,軍事上可以建立三維地形模型,做一些軍事演習 之類的。程式實現的過程如下 1.利用google earth 的com api 提取高程資料。2.基於directx 構...