體繪製(Volume Rendering)概述之2:體數據詳解!!!

http://blog.csdn.net/liu_lin_xm/archive/2009/11/22/4850593.aspx

摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文 名“GPU編程與CG語言之陽春白雪下里巴人”

體數據( Volume Data )
學習任何一門技術,首先要弄清楚這項技術的起源以及數據來源。技術的起源也就是技術最原始的需求,最原始的發展動力,瞭解了這一點就瞭解了這項技術的價值。而瞭解一門技術的數據來源,就把握了技術的最初脈絡,是 “ 持其牛耳 ” 的一種方法,正如軟件工程中的數據流分析方法一般。

我很想說,體數據與面數據的區別,就好像一個實心的鐵球和一個空心的兵乓球的區別。不過這個比喻很顯然有點俗,很難讓人相信作者(我)是一個專業人士。於是我決定還是將與體數據相關的專業術語都闡述一遍。

不過,在此之前,我需要先消除大家的恐懼感,研究表明,動物對於未知事物總是存在恐懼感,這也是阻礙進一步學習的關鍵所在。體數據不是什麼特別高深的火星符號,它是對一種數據類型的描述,只要是包含了體細節的數據,都可以稱之爲體數據。舉個例子,有一堆混凝土,其中包含了碳物質( C )若干,水分子( H20 )若干,還有不明化學成分的膠狀物,你用這種混凝土建造了塊方磚,如果存在一個三維數組,將方磚 X 、 Y 、 Z 方向上的物質分佈表示出來,則該數組可以被稱爲體數據。不要小看上面這個比喻,體數據本質上就是按照這個原理進行組織的!

體數據一般有 2 種來源:

  1.    科學計算的結果,如:有限元的計算和流體物理計算;
    
  2.    儀器測量數據,如: CT 或 MRI 掃描數據、地震勘測數據、氣象檢測數據等。
    

與體數據相關的專業術語有:體素( Voxel )、體紋理( Volume Texture )。尤其要注意:所謂面數據,並不是說二維平面數據,而是說這個數據中只有表面細節,沒有包含體細節,實際上體數據和麪數據的本質區別,在於是否包含了體細節,而不是在維度方面。

14.4.2 體素( Voxel )
Wikipedia 中對體屬 voxel 的介紹爲:

A voxel (a portmanteau of the words volumetric and pixel ) is a volume element, representing a value on a regular grid in three dimensional space. This is analogous to a pixel , which represents 2D image data in a bitmap 。

即 “ 體素,是組成體數據的最小單元,一個體素表示體數據中三維空間某部分的值。體素相當於二維空間中像素的概念 ” 。 圖 42 中每個小方塊代表一個體素。體素不存在絕對空間位置的概念,只有在體空間中的相對位置,這一點和像素是一樣的。

通常我們看到的體數據都會有一個體素分佈的描述,即,該數據由 nmt 個體素組成,表示該體數據在 X 、 Y 、 Z 方向上分別有 n 、 m 、 t 個體素。在數據表達上,體素代表三維數組中的一個單元。假設一個體數據在三維空間上 256256256 個體素組成,則,如果用三維數組表示,就必須在每一維上分配 256 個空間。

在實際的儀器採樣中,會給出體素相鄰間隔的數據描述,單位是毫米( mm ),例如 0.412mm 表示該體數據中相鄰體素的間隔爲 0.412毫米 。

在這裏插入圖片描述

14.4.1 體紋理( Volume Texture )
體數據最主要的文件格式是 “ 體紋理( volume texture ) ” !故而,非常有必要對體紋理的概念進行詳細的闡述。

目前,學術性文章中關於體紋理的概念描述存在不小的混亂,很多書籍或者網頁資料沒有明確的區分 2d texture , 3d texture , volume texture 之間的區別。導致不少人認爲 “ 只要是用於三維虛擬或仿真技術中的紋理都稱之爲 3d texture” 。這是一個誤會。紋理上的 2 , 3 維之分本質上是根據其所描述的數據維數而定的,所謂 2d texture 指的是紋理只描述了空間的面數據,而 3d texture 則是描述了空間中的三維數據。 3d texture 另一個較爲學術化的名稱是: volume texture 。文獻【 22 】上對體紋理的定義是:

3D texture (Three Dimensional Texture), also known as “volume texture,” is a logical extension of the traditional (and better known) 2D texture. In this context, a texture is simply a bitmap image that is used to provide surface coloring for a 3D model. A 3D texture can be thought of as a number of thin pieces of texture used to generate a three dimensional image map. 3D textures are typically represented by 3 coordinates.

翻譯成中文就是 “ 三維紋理,即體紋理,是傳統 2D 紋理在邏輯上的擴展。二維紋理是一張簡單的位圖圖片,用於爲三維模型提供表面點的顏色值;而一個三維紋理,可以被認爲由很多張 2D 紋理組成的,用於描述三維空間數據的圖片。三維紋理通過三維紋理座標進行訪問 ” 。

從上面這句話,可以得到兩點信息:

  1.    三維紋理和體紋理是同一概念;三維紋理和二維紋理是不同的;
    
  2.    三維紋理通過三維紋理座標進行訪問。
    

這時可能會有人提出問題了,圖片都是平面的,怎麼能表示三維數據?請注意,我們通常所看到的圖片確實都是平面的,但是並不意味着 x,y 平面上的像素點不能存放三維數據,舉一個例子:在高級語言編程中,我們完全可以用一維數組去存放三維數組中的數據,只要按照一定規則存放即可!

按照一定規則將三維數據存放在 XY 像素平面所得到的紋理,稱之爲 volume texture 。

體數據通常是由 CT 儀器進行掃描得到的,然後保存在圖片的像素點上。目前國際上比較常用的體紋理格式有,基於 DirectX 的 .dds 格式和 .raw 格式。注意,很多人會將 .raw 格式當作攝像器材使用的那種格式,其實這兩個格式的後綴雖然都是 .raw ,但是其數據組織形式是不同的。用於體紋理的 .raw 格式,存放的是三維數據,用於攝像器材的 .raw 格式只是普通的二維圖片。 圖 43 從左到右分別是 University of Tübingen ( Germany )、 Viatronix Inc.(USA) 、 Walter Reed Army Medical Center (USA) 三家機構的通過儀器掃描得到的體紋理數據的體繪製圖片。

在這裏插入圖片描述

這三個體紋理數據的描述分別是: 256 x 320 x 128 /0.66, 0.66, 0.66 ; 512 x 512 x 174/0.8398, 0.8398, 3.2 ; 512 x 512 x 463/0.625, 0.625, 1.0 。

由於在國內的網站上很難找到體數據,所以下面我給出幾個國外的網址,這些網址提供用於教學和研究只用的體紋理數據(只能用於教學和研究)。

http://wwwvis.informatik.uni-stuttgart.de/~engel/pre-integrated/data.html

http://www9.informatik.uni-erlangen.de/External/vollib/

http://www.volren.org/

體繪製算法
國際上留下的體繪製算法主要有:光線投射算法( Ray-casting )、錯切 - 變形算法( Shear-warp )、頻域體繪製算法( Frequency Domain )和拋雪球算法( Splatting )。其中又以光線投射算法最爲重要和通用。

究其原因,無外乎有三點:其一,該算法在解決方案上基於射線掃描過程,符合人類生活常識,容易理解;其二,該算法可以達到較好的繪製效果;其三,該算法可以較爲輕鬆的移植到 GPU 上進行實現,可以達到實時繪製的要求。

本書的第 15 章將重點闡述光線投射算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章