簡介
立體渲染(Volume rendering),又稱為立體繪製,是一種用於顯示離散三維採樣數據集的二維投影的技術。一個典型的三維數據集是 CT或者MRI採集的一組二維切面圖像。通常這些數據是按照一定規則如每毫米一個切面,並且通常有一定數目的圖像像素。這是一個常見的立體晶格的例子,每個體素用當前體素附近區域的採樣值表示。
為了渲染三維數據集的二維投影,首先需要定義相機相對於立體的空間位置。另外,需要定義每個點即體素的不透明性以及顏色,這通常使用RGBA(red, green, blue, alpha)傳遞函式定義每個體素可能值對應的 RGBA 值。
通過提取立體中等值的曲面並且將它們作為多邊形進行渲染,或者直接將立體作為數據塊進行渲染,這兩種方法都可以使立體可見。Marching Cubes 算法是從立體數據中提取曲面的常用技術。直接立體渲染是一件計算量很大的工作,可以用幾種不同的方法來實現。
直接立體渲染
直接立體渲染要求每個採樣值都必須映射到對應的不透明性以及顏色,這是通過一個“傳遞函式”實現的,這個傳遞函式可能是簡單的斜面、也可能是分段線性函式或這是任意的表格。一旦轉換到RGBA值之後,對應的 RGBA 結果就會映射到幀緩衝中對應的像素。根據渲染技術的不同這個做法也有所不同。
使用多種技術的組合也是可行的。例如去除扭曲的實現可以用紋理硬體在螢幕外的快取中繪製排列好的片斷。
投影圖像最簡單的方法就是立體光線投射。在這種方法中,每個圖像點都生成對應的光線。按照一個簡單的照相機模型,光線從照相機(通常是眼睛位置)中心開始投射,經過照相機與需要渲染的立體之間的假象平面上的圖像。光線在立體的邊界進行剪下以節約處理時間,然後在整個立體空間上按照一定規則對光線進行採樣。在每個採樣點數據進行插值計算,經過傳遞函式變換成 RGBA 採樣值,這個採樣添加到光線的 RGBA 數據集中,然後重複這個過程直到光線抵達立體內部。RGBA 顏色轉換到 RGB 顏色並且放到對應的圖像像素上。螢幕上的每個像素都重複這個過程直到形成完整的圖像。
Splatting這是一個通過犧牲質量換取速度的方法。每個立體元素都象雪球那樣按照從後到前的順序 splatted 到觀察表面。這些 splats 按照顏色與透明度特性在直徑方向正態即高斯變化渲染成圓盤。平盤與其它特性也根據套用的不同而不同。
Shear Warp一個新的立體渲染實現方法是 Philippe Lacroute 與 Marc Levoy 一起開發的在論文“使用 Shear-Warp 分解觀察角度變換的快速立體渲染”中描述的方法。在這種技術中,觀察角度進行變換使得最近的立體表面成為後台圖像緩衝區按照體素到像素的固定尺度排列的軸,然後渲染的立體按照方便的記憶體排列、固定的縮放及過渡因子放到這個緩衝區中。一旦立體的所有的切片已經渲染完畢,緩衝數據就會轉換到在前台顯示圖像中所要的方向及尺度。
這種方法通過犧牲採樣精度得到了相對較快的處理速度,但是這種方法生成的圖像潛在質量要比光線投射方法生成的圖像質量差。
許多三維圖形系統都通過紋理映射將圖像、紋理用於幾何物體。日常所用 PC 的圖形處理卡處理紋理非常快速並且能夠高效地渲染三維立體切片,並且具有實時的互動能力。
這些切片可以根據立體進行排列然後按照觀察者的角度進行渲染,也可以根據觀察平面進行排列然後從立體中未經排列的切片進行採樣。對於第二種技術來說需要圖形硬體支持三維紋理處理。
根據立體排列紋理的方式能夠生成合理的圖像質量,但是當立體旋轉的時候經常會產生明顯的過渡。根據視角排列紋理的方式可以得到類似於光線投射的高質量圖像,並且採樣圖案也是相同的。
最近出現的一項加速渲染的技術是使用圖形處理卡加速如光線投射這樣的傳統立體渲染算法。從 2000年左右開始出現的可程式pixel shaders開始,人們逐漸認識到多點並行運算的威力並且開始在圖形晶片上執行更加普通的計算。曾經一度叫作“暫存器組合器”的 pixel shaders 能夠隨機地讀寫紋理記憶體並且執行一些基本的算術與邏輯計算。這些現在稱為GPU 的單指令流多數據流處理器用於如光線跟蹤多邊形以及信號處理中的普通計算。在 OpenGL2.0 版上,pixel shaders 現在能夠作為多指令流多數據流處理器使用並且能夠獨立進行分支切換,能夠使用高達 48 個並行處理單元,並且能夠使用高達 1 GB 的紋理記憶體以及 high bit depth 數字格式。通過這樣的能力,理論上象立體光線投射或者 CT 重建這樣的算法都能夠得到極大的加速。
最佳化技術
跳過空閒空間立體渲染系統經常帶有一個識別立體區域是否包含可見物體的部分,這個信息可以用於避免在這些透明區域進行渲染。
光線提前終止這是按照從前到後順序渲染立體的時候所用的一項技術。對於穿過一個像素的光線,一旦達到一定程度的濃度,那么後面的採樣點對於這點來說就起不到多大作用,因此可以忽略。
八叉樹及二元空間分割使用如八叉樹或者二元空間分割樹的層次結構對於立體數據壓縮以及最佳化立體光線投影過程來說都非常有用。
立體分割通過分割出渲染前不需要關心的部分,就可以大幅度地減少光線投影或者紋理混合所需要的計算量。