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