基於紋理的體繪製技術[譯]

轉自:http://pkuwwt.github.io/scholarship/2013-12-04-gpugems-ch39-texture-based-volume-rendering/

這一章介紹的是基於紋理的體繪製技術,可用於可視化三維數據集,或生成高質量的特效。

39.1 介紹

許多視覺效果天生就是3維的(有體積的)。比如,流體,雲,火,煙,霧,塵土等,都是難以用幾何圖元來建模的。而體模型則更適合生成這樣的效果。這些模型假設光線會由體數據中大量的粒子發射,吸收並且散射。如圖39-1所示的兩個例子。

圖39-1 體效果

圖39-1 體效果

除了用於建模並渲染體現象,體繪製對於需要可視化三維數據集的科學工程應用來說是一種關鍵的技術。比如,醫學成像數據的可視化,計算流體力學仿真數據的可視化。交互式體繪製應用的用戶關心高效的數據探索和特徵發掘,因此依賴於現代圖形硬件加速器的性能。

本章描述了體繪製技術,該技術利用了現代GPU的靈活的編程模型和3維紋理功能。雖然,在GPU上也可以實現其它流行的體繪製算法,比如光線投射(Roettger et al.2003, Kruger和Westermann 2003),本章主要涉及的是基於紋理的體繪製。基於紋理的技術易於與多邊形算法結合,僅需要多渲染幾遍而已,在提供很大程度的交互性的同時也不犧牲渲染質量。

39.2節介紹了相關術語,並解釋了直接體繪製的過程。39.3節描述了典型的基於紋理的體繪製應用的組成部分,並給出了一個簡單的示例。39.4節提供了實現細節,擴展了基本體繪製的功能。39.5節描述了增加真實感光照和過程性細節的高級渲染技術。39.6節總結了相關的性能問題。

39.2 體繪製

直接體繪製方法由3維體數據直接生成圖像,而不顯式地從數據中提取幾何表面(Levoy 1988)。這些技術使用一種光學模型來將數據值映射爲光學屬性,比如顏色和透明度(Max 1995)。在渲染過程中,光學屬性沿每條視線光線累積起來,形成數據的渲染結果圖像(如圖39-2)。

圖39-2 體繪製過程

圖39-2 體繪製過程

雖然這個數據被視爲空間中的連續函數,但實際上它往往被表示成一個均勻的3維採樣點數組。在顯存內,體數據被存爲多個2維紋理切片,或單個3維紋理對象。名詞_體元_(voxel)表示單個的”體數據元素”,類似於名詞_像元_(pixel)所表示的”圖片元素”,以及_紋素_(texel)所表示的”紋理元素”。每個體元對應於數據空間中的一個位置,並且附帶有一個或多個數據值。中間位置上的值則可通過附近體元插值獲得。這個過程被稱爲_重構_(reconstruction),它在體繪製和相關數據處理應用中非常重要。

本質上,光學模型的作用是描述了體數據中的粒子如何與光線相互作用。比如,最常用到的模型假設體數據包含了能同時發射和吸收光線的粒子。更復雜的模型考慮了局部光照和體陰影,以及光線散射效果。光學參數由數據值直接指定,或者通過一個或多個_傳輸函數_(transfer functions)來映射。可視化應用中,傳輸函數的目標是強調或對數據中的感興趣特徵進行_分類_。典型情況下,傳輸函數由_紋理查找表_來實現,儘管簡單的傳輸函數可以在片元着色器中計算。比如,圖39-2展示了用一個傳輸函數提取牙齒CT掃描數據中的材料邊界。

體繪製通過延視線方向對體數據進行採樣,然後累積結果光學屬性,最後生成圖像。如圖39-3所示。對於發射-吸收模型而言,顏色和透明度的累積由公式1來計算,其中CiCiAiAi是顏色和不透明度,它們由採樣點ii處的數據值根據傳輸函數來指定。

圖39-3 體採樣和合成

圖39-3 體採樣和合成

公式1 離散體繪製方程

CA=i=1nCij=1i1(1Aj)=1j=1n(1Aj)C=∑i=1nCi∏j=1i−1(1−Aj)A=1−∏j=1n(1−Aj)

不透明度AjAj近似表達了光線吸收過程,而經過不透明度加權的顏色CiCi則近似表達了延光線片段(iii+1i+1之間)發射和吸收。對於顏色分量而言,累加中的乘積表達了光線從採樣點ii到達眼睛前的衰減後的結果。通過對沿視線光線對採樣點進行排序,此公式可以高效地迭代地計算出顏色CC和不透明度AA。39.4節描述了_合成_步驟是如何通過alpha混合來實現的。因爲公式1是對連續光學模型的數值近似模擬,採樣率s,與採樣點ll之間的距離成反比,因此,極大地影響了近似的精度和渲染的質量。

基於紋理的體繪製技術也包括了採樣和合成兩個步驟,只不過是通過繪製一系列的2維幾何圖元來實現的。如圖39-3所示。每個圖元都通過對體數據紋理進行採樣設置了紋理座標。這些__代理幾何體__被光柵化後,合成到幀緩衝區中,合成順序可以是由後至前,也可以是由前至後。在片元着色階段,插值得到的紋理座標用於查找數據紋理。接下來,插值得到的數據值用於在傳輸函數紋理查找表中獲取光學屬性(顏色和不透明度)。光照技術則可以在合成階段之前修改結果顏色。

39.3 基於紋理的體繪製

如圖39-4所示,一般來說,基於紋理的體繪製算法可以劃分爲三個步驟:

  • 初始化
  • 更新
  • 繪製

初始化階段常常只執行一次,更新和繪製階段在響應用戶輸入時就會執行,比如,當觀察參數或渲染參數修改時。

圖39-4 典型的基於紋理的體繪製的實現流程圖

圖39-4 典型的基於紋理的體繪製的實現流程圖

在應用的開始時,體數據被加載到CPU內存中。在某些情形下,數據集在傳到紋理內存之前還需要進一步處理。比如,用戶可能會在這個階段對數據計算梯度或下采樣。一些數據處理操作可以在程序之外進行。傳輸函數查找表和片元着色器通常會在初始化階段創建。

在初始化結束之後,每當觀察參數發生變化,代理幾何體就會重新計算,然後存於頂點數組中。當數據集存儲成3維紋理對象時,代理幾何體包含一系列的多邊形,位於垂直於視線方向的切片上(見39.4.2節)。切片多邊形是通過切片平面與體數據包圍盒相交計算得到,頂點沿順時針或逆時針。對於每個頂點而言,其3維紋理座標可以在CPU計算,也可以在頂點着色器中計算,或者通過自動紋理座標生成。

當一個數據集存成2維紋理切片時,代理多邊形只是簡單的與切片對齊的矩形。儘管要快一些,這個方法有一些缺點。首先,它需要3倍的存儲,因爲數據切片需要在3個主方向上進行。這種數據複製可以通過實時重構切片來避免(Lefohn等, 2004),但會有一些性能開銷。其次,採樣率取決於體數據的分辨率。這個一可以通過添加中間切片並在片元着色器中使用三線性插值來解決(Rezk-Salama等, 2000)。第三,採樣距離隨視點變化,導致攝像機移動時密度會發生變化,並且切片之間的切換導致圖像的跳躍(Kniss等 2002b)。

在更新階段,如果渲染模式或傳輸函數參數發生變化,紋理就會更新。此外,如果採樣率發生變化(見公式3),傳輸函數紋理的不透明度修正也會在此執行。

在切片多邊形按序繪製之前,渲染階段需要設置正確。這個步驟一般包括了禁止光照和裁剪,設置alpha混合等。爲了在不透明幾何體中合成,深度測試必須開啓,而深度緩衝區的寫操作要禁用。體紋理和傳輸函數紋理需要綁定到紋理單元上,作爲片元着色器的輸入。此時,着色器輸入參數也要指定,頂點數組要爲渲染作好準備。最後,當切片按序繪製完成之後,渲染狀態復原,以便算法不會影響場景中其它對象的顯示。

39.3.1 一個簡單的示例

下面的示例的主要是作爲一個理解基於紋理體繪製算法實現細節的起點。在此例中,傳輸函數是固定的,數據集直接表示不透明度,發射的顏色設置爲常量的灰色。此外,視線方向沿數據座標系的z軸方向。因此,代理幾何體包含了多個x-y平面內的矩形,它們沿z軸均勻分佈。此算法包含了如下步驟,如示例39-1所示。

示例39-1. 簡單體繪製應用的步驟

  • 將數據存儲爲3維alpha紋理,載入顯存
  • 加載片元列表39-1所示的着色器
  • 加載模型視圖矩陣和投影矩陣
  • 啓用alpha混合,用於源片元的值爲1,用於目標片元的值爲(1-source alpha)
  • 禁用光照和深度測試(本例中沒有不透明幾何體)
  • 將數據紋理綁定到紋理單元0
  • 啓用,並綁定片元着色程序,指定其輸入
  • 沿z軸繪製指定了紋理的四邊形。其x-y頂點座標是(-1,-1),(1,-1),(1,1),(-1,1)。其對應的x-y紋理座標是(0,0),(1,0),(1,0),(0,1)。頂點z座標從-1到1均勻遞增,而紋理z座標從0到1。

列表39-1. 簡單體繪製片元着色程序

void main(uniform float3 emissiveColor,
        uniform sampler3D dataTex,
        float3 texCoord: TEXCOORD0,
        float4 color: COLOR) {
    float a = tex3D(texCoord, dataTex); // Read 3D data texture
    color = a * emissiveColor;          // Multiply color by opacity
}

圖39-5展示了這個簡單體渲染器生成的結果圖像。下面的章節將講解如何讓此例中的每一步更一般化和有用,以便於處理不同的任務。

圖39-5 一個熟悉的模型體素化後經過簡單體渲染器得到的結果

圖39-5 一個熟悉的模型體素化後經過簡單體渲染器得到的結果

39.4 實現細節

本節將概述在基於紋理的體繪製應用中常用的組件。其目的在於提供足夠的細節讓讀者更易於理解體繪製器的典型實現,它們利用了當前的消費圖形硬件,比如Geforce FX類的顯卡。

39.4.1 數據表達和處理

### 39.4.2 代理幾何體 ### 39.4.3 渲染 ## 39.5 高級技術 ### 39.5.1 體光照 ### 39.5.2 過程性渲染 ## 39.6 性能考慮 ### 39.6.1 光柵化瓶頸

39.7 總結

39.8 參考文獻

附:翻譯對照表

本文中翻譯所涉及到的詞彙:

  • volume rendering: 體繪製,一般特指直接體繪製,比如光線投射,基於紋理映射的體繪製
  • direct volume rendering: 直接體繪製
  • rendering: 渲染
  • volume: 體數據
  • data sets: 數據集
  • geometric primitives: 幾何圖元
  • medical imaging: 醫學成像
  • ray casting: 光線投射(算法)
  • voxel: 體元
  • texel: 紋素
  • transfer function: 傳輸函數。將數據值映射爲光學屬性,比如顏色,透明度
  • proxy geometry: 代理幾何體
  • volumetric phenomena: 體現象
  • volumetric model: 體模型
  • volumetric lighting: 體光照
  • volumetric shadow: 體陰影
  • procedural rendering: 過程性渲染
  • procedural noise: 過程性噪聲
  • rasterization: 光柵化

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