隨著"數字化人"的研究,人體器官模型的建立需要越來越豐富的信息,凹凸紋理映射技術可以使數字化模型更加真實和生動。在基于分塊映射方法的基礎上,采用法線式凹凸紋理映射的方法,通過歸一化模型表面法向量,計算紋理坐標的偏移量并添加到紋理坐標,將其投影到切空間中實現了對模型表面法向量的擾動,完成了生物器官模型表面的凹凸紋理映射,進一步改善了數字化器官模型的可視化效果,提高了器官模型的真實感。
引用本文: 張婕, 成彬, 王曉明, 周競濤. 法線式凹凸映射在分塊紋理映射中的應用. 生物醫學工程學雜志, 2014, 31(4): 899-904. doi: 10.7507/1001-5515.20140169 復制
引言
在醫學領域,通過三維切片數據獲取器官的表面模型已經有了相對成熟的技術。但在滿足實時繪制器官模型的前提下,利用器官三維表面模型數據,建立具有厚度的模型,并在其內外表面添加紋理,進行真實感渲染,建立具有真實紋理的生物器官模型庫方面的研究相對較少。而生物器官模型的數字化可以為虛擬手術、醫學教學及生理知識普及等領域帶來巨大的方便,將生物器官模型數字化技術引入手術的三維模擬設計、效果評測和外科整形,可輔助術前診斷評估,改變傳統的手術模式,提高了手術的安全性和效果,對于手術的發展具有重要的意義。“數字化人”的研究建立了人體器官的三維模型,在此基礎上增加豐富的紋理信息對虛擬手術、多媒體教學、遠程醫療等均有重要意義[1]。與顏色紋理相比較,凹凸紋理映射技術用于繪制物體表面的細節,更能夠增加繪制對象的真實程度。
本文基于信息量最大化原則將生物器官模型的紋理分塊“貼”到模型上,再在其表面進行凹凸紋理映射,該技術通過改變模型表面紋理的法向量,實現模型表面具有粗糙感的視覺效果,核心是采用法線式凹凸紋理映射技術使其表面具有凹凸感,得到與實物模型非常接近的數字化三維生物器官模型。
1 法線式凹凸紋理映射技術原理
1.1 分塊紋理映射
分塊紋理映射是采用基于信息最大化的紋理選取原則[2],應用平面映射算法進行映射,該方法是將三維物體表面分成多塊,選取最合適的紋理圖片對每塊表面進行映射,從而在整個三維物體表面都“貼”上紋理圖案。本文所用的信息量最大化原則為:對同一三角面片,當有多個不同角度的紋理對應時,應選擇對應面積最大的圖像區域作為其紋理圖像,即利用三角面片的法向量與視線的夾角余弦來判定,如圖 1所示。

本文所建立的物體表面數字模型由三角面片構成,在存儲三角面片的數據結構中,用tex_map_angle這一浮點型變量來保存PM的距離值d,當紋理多次映射到三角面片上時,通過判定新舊兩個d值來確定是否要用新的紋理替換舊的紋理[3]。使用分塊紋理映射時,可以在模型表面添加顏色紋理,但其表面仍是光滑曲面,如有光照,則會出現高光現象。為了使器官模型表面更加真實,本文進一步采用凹凸映射技術,使其表面呈現自然的凹凸感。
1.2 凹凸映射技術原理
使模型表面呈現凹凸效果,可以通過增加組成模型表面三角面片數量實現,但存儲數據就會大量增加。本文使用的凹凸映射技術并不增加三角面片的數量,而是通過修改模型表面的光線方向來制造“凹凸”效果,通常采用浮雕式凹凸映射和法線式凹凸映射。凹凸紋理映射是將粗糙信息添加在物體表面,并在視覺效果上能產生很吸引人的凹凸效果。如圖 2中兩個有凹凸感的表面,該表面本身是平的,但通過添加一點信息就可以使它看起來有一種粗糙感,該信息就是多邊形的光方向,因此凹凸映射是一種負責光方向的紋理映射[4]。

從遠距離來看,判斷物體是否粗糙的唯一證據是在它表面上下的亮度有改變。人的大腦通過圖案信息中的亮暗不一來判斷它們表面中的凹凸部位。圖 2中左右兩幅圖幾乎相同,在這兩個浮雕式的表面中有印入表面的矩型和字母,右圖不同于左圖的是它旋轉了180°,是前一幅圖倒轉的圖像。然而倒轉的結果是先前看起來凹進去的區域,現在看起來凸出來了,這是由于它的光源變了。如果用手觸摸這兩幅圖,它們的表面仍然是平整的,就好比將圖像放在監控器玻璃下面適當的位置,不需要再做任何其它的工作。
可見凹凸映射技術實際上是將Phong著色技術擴展了,本質上二者是一致的,凹凸映射技術在光照計算時就通過近似計算表面頂點處的光強度值來提供表面的粗糙信息。為了在計算機中通過光照模型來實現物體表面的凹凸感,一般采用只有反射光參與的Phong光照模型。
$~I={{I}_{e}}+{{I}_{d}}+{{I}_{s}}={{K}_{a}}\cdot {{I}_{a}}+{{I}_{p}}[{{K}_{d}}\left( L\cdot N \right)+{{K}_{s}}{{\left( V\cdot R \right)}^{n}}]\text{ ,}$ |
其中Ie為環境光的亮度,Ip為點光源的強度,Ka為物體表面所具有的環境光反射系數(ambient reflection coefficient),Kd為物體表面的漫反射系數(diffuse reflection coefficient),Ks為物體表面的鏡面反射系數(specula reflection),n為鏡面高光指數;L為從物體表面上一點P指向光源的矢量,N為P點法向矢量,R為反射光線向量,V為視點方向向量,且L,N,R,V均為單位化向量[5]。
在計算機圖像處理中,如果將具有凹凸紋理的圖片直接映射到物體上,物體表面呈現出的凹凸感是不夠真實的,真實的凹凸紋理應該具有隨機的法線方向,凹凸紋理映射就是通過改變物體表面的法向矢量來改變物體的亮度,從而造成一種凹凸現象。
1.3 法線式凹凸紋理映射技術
在計算機圖形學中,法線式凹凸紋理映射是凹凸映射技術的一種應用,法線式映射也稱為“點乘凹凸貼圖” (dot product bump mapping),該方法目前主要在圖形硬件中使用,用于實現物體表面的凹凸效果并且應用得很廣泛。在不增加多邊形的情況下,法線式凹凸紋理映射可在濃淡效果中添加細節。如何在生物器官這類極不規則的曲面上進行凹凸映射是本文的主要研究內容。與顏色紋理映射相比,法線凹凸紋理映射需要顯卡的支持,因此在使用該技術時先要檢驗顯卡是否支持,如果不支持,程序將失敗。
法線凹凸紋理映射技術通過輸入的法線圖改變了物體表面原來的法向矢量,通過光照模型來表現出物體表面的凹凸感,且加入了鏡面高光分量。所以,使用法線凹凸紋理映射技術所繪制出來的物體凹凸感更強,也更真實。
設一物體模型表面為S,用參數方程表示為
$S=S\left( x,y \right)$ |
表面S沿x,y方向的偏導數分別用Sx,Sy來表示,那么表面上任一點(x,y)的法向量N由下面計算公式求得,即
$N=N\left( x,y \right)={{S}_{x}}\times {{S}_{y}}$ |
將N單位化得到單位法向量n,即
$n=\frac{{{S}_{x}}\times {{S}_{y}}}{\left| {{S}_{x}}\times {{S}_{y}} \right|}$ |
若要使物體表面產生變化,則可在每個采樣點處沿其法線方向增加一個微小變量,從而得到一個新的曲面,可表示為
$S′(x,y)=S(x,y)+R(x,y)n$ |
這里用一個自定義的擾動函數R(x,y)作微小變量,并設其為連續可微函數,在新的曲面方程分別對x,y進行求導,可得下式:
$S{{\prime }_{x}}\left( x,y \right)={{S}_{x}}\left( x,y \right)+{{R}_{x}}\left( x,y \right)n+R\left( x,y \right){{n}_{x}}$ |
$S{{\prime }_{y}}\left( x,y \right)={{S}_{y}}\left( x,y \right)+{{R}_{y}}\left( x,y \right)n+R\left( x,y \right){{n}_{y}}$ |
上式最后一項可以略去,因為擾動函數R(x,y)產生的擾動幅度與物體表面模型的尺寸相比很小,因此可求得擾動后的法向量近似為
$N\prime =S{{\prime }_{x~}}\times S{{\prime }_{y}}={{S}_{x}}\times {{S}_{y}}+{{R}_{x}}\left( n\times {{S}_{y}} \right)+{{R}_{y}}\left( {{S}_{x}}\times n \right),$ |
式中Rx(n×Sy)和Ry(Sx×n)為法向量N的擾動項,將擾動后的法向量N單位化,并在光照模型中產生擾動作用。圖 3則表示產生物體表面粗糙感的過程,它是通過擾動函數改變法向量來實現的。

(a)光滑表面
(a) the original normal vector N of smooth surface
簡單網格圖案,字母圖案Z緩沖器圖案和隨意手繪的花紋圖案經過數學定義都曾經被Blinn用來作為擾動,該紋理擾動函數R(x,y)為可求導的任意函數,當R(x,y)不能用數學方法定義時,也可用一個二維(x,y)查詢表給出若干離散點的擾動函數值,再用雙線性插值法求得其它點處的擾動函數值,而偏導數則可用有限差分法來求。圖 4則是根據上述原理所繪制的兩個凹凸紋理映射實例。其中左圖為模擬一維正弦函數構造的凹凸紋理以及遍布表面的細小凹凸紋理,該紋理用于模擬物體材料表面的粗糙感。其擾動函數為
$S\left( x,y \right)=Asin(x/T),$ |
其中A為擾動幅度,T為擾動周期,該表面是在原來平面的法向量的基礎上疊加了一個沿x方向的擾動項Sx(x,y)=A/Tcos(x/T),再利用隨機數t的正弦值sin(t)對平面進行小幅度的不規則擾動形成其中細小的凹凸紋理。
圖 4的右圖模擬的是一個二維凹凸紋理,在一個平面上形成在兩個相互垂直的方向上同時起伏變化的凹凸,即擾動后的表面法向量等于原來平面的法向量上疊加一個沿x方向的擾動項A1cos(x/T1)和y方向的擾動項A2cos(x/Y1+y/T2)動項,可用來模擬光滑表面的凹凸感[6]。

法線凹凸紋理映射技術并不改變物體實際的幾何造型,而是在法線圖中保存每個頂點的法線值,并替換物體表面各頂點的實際法線向量為每個三角面片上的每個像素賦予虛擬的法線,而不需要由高度圖經過一系列的變換而求得每個頂點的法線,使計算的時間大大縮短。因此,光線反射是按照虛擬的法線計算出來,并不是按照真正的平面三角形法線計算,這樣可以使得一塊并非真實凹凸的區域看起來具有“三維”的感覺。為使渲染出來的效果更加真實,在該技術中的光線不僅包含漫反射分量,還添加了鏡面高光分量,在視點固定的情況下觀察到的效果相當好;另外,為了進一步提高繪制速度,可以借助于shader 編程來實現法線凹凸紋理映射技術。
為了使物體表面能夠呈現出逼真的凹凸感,模型表面的光線反射方向也應具有很大的隨機性,而在計算機圖像處理中,凹凸紋理映射是借助于光照模型來實現的,物體表面某點的亮度是通過該點法向矢量的函數來表達,因此,改變了物體表面的法向矢量,就能夠改變物體表面的亮度,進一步造成物體表面的凹凸現象。若對物體頂點的法向量進行改變,則需將物體坐標、法向矢量、光線矢量統一在一個坐標系中,也就是需要建立一個“切空間”。如圖 5所示。
建立好切空間后,利用公式(10)[7]將光線矢量投影到切空間中,為每個頂點計算相對于切空間的光線向量。
$~[{{L}_{relx}}~{{L}_{rely}}~{{L}_{relz}}\left] = \right[{{L}_{x}}~{{L}_{y}}~{{L}_{z}}]\times {{M}_{n}}$ |
其中[Lrelx Lrely Lrelz]是相對于頂點切空間的光線向量,在進行凹凸貼圖時要用,作為法線矢量的偏移量,與原法線矢量相加引起法線偏移,從而產生凹凸紋理。

2 法線式凹凸紋理映射技術的應用
2.1 簡單擾動函數生成的紋理
本文模型的建立是在生物器官模型可視化原型系統[3]上實現的。該系統由生物器官模型構建課題組在Microsoft Visual Studio VC++.NET 2003集成開發環境下研究開發,利用OpenGL編程實現。其功能模塊主要有文件的輸入輸出及保存、紋理的添加與變換、模型的操作以及模型顯示方法等。
本文實驗對象為胃模型,其特點為結構相對簡單,只有一個空腔,而且胃壁的厚度比較均勻,內部有不規則的褶皺。建立雙層胃模型,其厚度可根據醫生的判斷進行改變。首先建立一個具有厚度的胃模型,該生物器官模型具有內外兩層表面,由于對模型的數據采集過程中已經將外表面的凹凸表現出來,因此對其外表面只進行顏色紋理映射即可。而內表面是由系統生成的一個光滑的表面,因此還需要進行凹凸映射。
在該實驗中,選擇擾動函數是關鍵。按照之前的理論,在一維凹凸紋理映射和二維凹凸紋理映射中,選擇余弦函數S(x,y)=Asin(x/T)作為擾動函數,即可得到有凹凸感的視覺效果,將此函數運用到胃模型后,得到如圖 6所示的結果。

由圖 6可見,由于函數形式單一,使得該函數在自由曲面上造成的擾動形式單調,形成的凹凸紋理大規則,所以盡管凹凸感很強烈,但其效果并不接近于真實模型,故擾動函數仍需改進。
2.2 改進后的擾動函數生成的紋理
下面對采用的法線式凹凸紋理映射作進一步改善。
已知每個表面的法線信息,還需要追加兩個矢量到頂點法線以便定義一個平面,法線、切向矢量、及第二切向矢量(副法線)組成的 “切空間”。切空間主要是一個向量的集合,用以定義一個局部的坐標系統。擾動后的表面法向量等于原來平面的法向量上疊加一個沿x方向的擾動項A1cos(x/T1)和y方向的擾動項A2cos(x/Y1+y/T2),將表面的實際法線向量存儲在法線圖中,然后可以將含有法線的凹凸紋理和經過插值的光源向量在每個像素點結合起來,可以使用點乘,得到如圖 7所示結果。

(a)較小擾動;(b)較大擾動;(c)合適擾動
Figure7. The bump texture with different disturbance(a) small disturbance; (b) large disturbance; (c) appropriate disturbance
以上三幅圖的差別是由于設置了不同的法線擾動幅度A所得的。圖 7(a)中,由于設置的擾動幅度值比較小,為0.05,較小擾動使得內外紋理有變化但差別不大,并未達到預期的目的。圖 7(b)中由于將擾動幅度值設置為1.50,擾動過大,導致紋理顏色失真,仍未達到較好的效果。經過反復多次實驗,圖 7(c)中達到了預期的效果,此時的擾動幅度設為1.05,模型內壁顏色既不失真,又有凹凸不平的視覺效果,圖 8為其內壁凹凸映射放大了的細節圖。

通過以上實驗結果表明,凹凸映射能夠改變光滑的顏色紋理,在模擬真實物體粗糙的表面中,能展示很好的效果,提高了數字化模型的真實感。
3 結論與展望
在現階段,物體表面細節的關鍵問題之一為物體表面的幾何造型,物體表面的信息包含顏色、高度和材質信息等等。將盡可能多的信息快速有效地體現在物體表面上是紋理繪制的一個重要研究方向。因此,對復雜紋理繪制技術的研究方向有如下擴展:
(1)對于自然界中極不規則物體的表面進行紋理映射還沒有統一的數學模型可以應用,因此凹凸映射中的擾動函數還不具有普遍的應用能力。而擾動函數的選取對于三角面片構造的數字化模型的紋理影響比較大,如何尋找具有普遍應用價值的、有效的擾動函數是一項非常具有挑戰性的課題。
(2)對于內外表面具有不同的紋理的部分模型,如何分別進行紋理映射是BOV系統(生物器官模型可視化原型系統)需要進一步改進的方向,這需要改變程序中紋理映射的過程,對系統提出了更高的要求。
引言
在醫學領域,通過三維切片數據獲取器官的表面模型已經有了相對成熟的技術。但在滿足實時繪制器官模型的前提下,利用器官三維表面模型數據,建立具有厚度的模型,并在其內外表面添加紋理,進行真實感渲染,建立具有真實紋理的生物器官模型庫方面的研究相對較少。而生物器官模型的數字化可以為虛擬手術、醫學教學及生理知識普及等領域帶來巨大的方便,將生物器官模型數字化技術引入手術的三維模擬設計、效果評測和外科整形,可輔助術前診斷評估,改變傳統的手術模式,提高了手術的安全性和效果,對于手術的發展具有重要的意義。“數字化人”的研究建立了人體器官的三維模型,在此基礎上增加豐富的紋理信息對虛擬手術、多媒體教學、遠程醫療等均有重要意義[1]。與顏色紋理相比較,凹凸紋理映射技術用于繪制物體表面的細節,更能夠增加繪制對象的真實程度。
本文基于信息量最大化原則將生物器官模型的紋理分塊“貼”到模型上,再在其表面進行凹凸紋理映射,該技術通過改變模型表面紋理的法向量,實現模型表面具有粗糙感的視覺效果,核心是采用法線式凹凸紋理映射技術使其表面具有凹凸感,得到與實物模型非常接近的數字化三維生物器官模型。
1 法線式凹凸紋理映射技術原理
1.1 分塊紋理映射
分塊紋理映射是采用基于信息最大化的紋理選取原則[2],應用平面映射算法進行映射,該方法是將三維物體表面分成多塊,選取最合適的紋理圖片對每塊表面進行映射,從而在整個三維物體表面都“貼”上紋理圖案。本文所用的信息量最大化原則為:對同一三角面片,當有多個不同角度的紋理對應時,應選擇對應面積最大的圖像區域作為其紋理圖像,即利用三角面片的法向量與視線的夾角余弦來判定,如圖 1所示。

本文所建立的物體表面數字模型由三角面片構成,在存儲三角面片的數據結構中,用tex_map_angle這一浮點型變量來保存PM的距離值d,當紋理多次映射到三角面片上時,通過判定新舊兩個d值來確定是否要用新的紋理替換舊的紋理[3]。使用分塊紋理映射時,可以在模型表面添加顏色紋理,但其表面仍是光滑曲面,如有光照,則會出現高光現象。為了使器官模型表面更加真實,本文進一步采用凹凸映射技術,使其表面呈現自然的凹凸感。
1.2 凹凸映射技術原理
使模型表面呈現凹凸效果,可以通過增加組成模型表面三角面片數量實現,但存儲數據就會大量增加。本文使用的凹凸映射技術并不增加三角面片的數量,而是通過修改模型表面的光線方向來制造“凹凸”效果,通常采用浮雕式凹凸映射和法線式凹凸映射。凹凸紋理映射是將粗糙信息添加在物體表面,并在視覺效果上能產生很吸引人的凹凸效果。如圖 2中兩個有凹凸感的表面,該表面本身是平的,但通過添加一點信息就可以使它看起來有一種粗糙感,該信息就是多邊形的光方向,因此凹凸映射是一種負責光方向的紋理映射[4]。

從遠距離來看,判斷物體是否粗糙的唯一證據是在它表面上下的亮度有改變。人的大腦通過圖案信息中的亮暗不一來判斷它們表面中的凹凸部位。圖 2中左右兩幅圖幾乎相同,在這兩個浮雕式的表面中有印入表面的矩型和字母,右圖不同于左圖的是它旋轉了180°,是前一幅圖倒轉的圖像。然而倒轉的結果是先前看起來凹進去的區域,現在看起來凸出來了,這是由于它的光源變了。如果用手觸摸這兩幅圖,它們的表面仍然是平整的,就好比將圖像放在監控器玻璃下面適當的位置,不需要再做任何其它的工作。
可見凹凸映射技術實際上是將Phong著色技術擴展了,本質上二者是一致的,凹凸映射技術在光照計算時就通過近似計算表面頂點處的光強度值來提供表面的粗糙信息。為了在計算機中通過光照模型來實現物體表面的凹凸感,一般采用只有反射光參與的Phong光照模型。
$~I={{I}_{e}}+{{I}_{d}}+{{I}_{s}}={{K}_{a}}\cdot {{I}_{a}}+{{I}_{p}}[{{K}_{d}}\left( L\cdot N \right)+{{K}_{s}}{{\left( V\cdot R \right)}^{n}}]\text{ ,}$ |
其中Ie為環境光的亮度,Ip為點光源的強度,Ka為物體表面所具有的環境光反射系數(ambient reflection coefficient),Kd為物體表面的漫反射系數(diffuse reflection coefficient),Ks為物體表面的鏡面反射系數(specula reflection),n為鏡面高光指數;L為從物體表面上一點P指向光源的矢量,N為P點法向矢量,R為反射光線向量,V為視點方向向量,且L,N,R,V均為單位化向量[5]。
在計算機圖像處理中,如果將具有凹凸紋理的圖片直接映射到物體上,物體表面呈現出的凹凸感是不夠真實的,真實的凹凸紋理應該具有隨機的法線方向,凹凸紋理映射就是通過改變物體表面的法向矢量來改變物體的亮度,從而造成一種凹凸現象。
1.3 法線式凹凸紋理映射技術
在計算機圖形學中,法線式凹凸紋理映射是凹凸映射技術的一種應用,法線式映射也稱為“點乘凹凸貼圖” (dot product bump mapping),該方法目前主要在圖形硬件中使用,用于實現物體表面的凹凸效果并且應用得很廣泛。在不增加多邊形的情況下,法線式凹凸紋理映射可在濃淡效果中添加細節。如何在生物器官這類極不規則的曲面上進行凹凸映射是本文的主要研究內容。與顏色紋理映射相比,法線凹凸紋理映射需要顯卡的支持,因此在使用該技術時先要檢驗顯卡是否支持,如果不支持,程序將失敗。
法線凹凸紋理映射技術通過輸入的法線圖改變了物體表面原來的法向矢量,通過光照模型來表現出物體表面的凹凸感,且加入了鏡面高光分量。所以,使用法線凹凸紋理映射技術所繪制出來的物體凹凸感更強,也更真實。
設一物體模型表面為S,用參數方程表示為
$S=S\left( x,y \right)$ |
表面S沿x,y方向的偏導數分別用Sx,Sy來表示,那么表面上任一點(x,y)的法向量N由下面計算公式求得,即
$N=N\left( x,y \right)={{S}_{x}}\times {{S}_{y}}$ |
將N單位化得到單位法向量n,即
$n=\frac{{{S}_{x}}\times {{S}_{y}}}{\left| {{S}_{x}}\times {{S}_{y}} \right|}$ |
若要使物體表面產生變化,則可在每個采樣點處沿其法線方向增加一個微小變量,從而得到一個新的曲面,可表示為
$S′(x,y)=S(x,y)+R(x,y)n$ |
這里用一個自定義的擾動函數R(x,y)作微小變量,并設其為連續可微函數,在新的曲面方程分別對x,y進行求導,可得下式:
$S{{\prime }_{x}}\left( x,y \right)={{S}_{x}}\left( x,y \right)+{{R}_{x}}\left( x,y \right)n+R\left( x,y \right){{n}_{x}}$ |
$S{{\prime }_{y}}\left( x,y \right)={{S}_{y}}\left( x,y \right)+{{R}_{y}}\left( x,y \right)n+R\left( x,y \right){{n}_{y}}$ |
上式最后一項可以略去,因為擾動函數R(x,y)產生的擾動幅度與物體表面模型的尺寸相比很小,因此可求得擾動后的法向量近似為
$N\prime =S{{\prime }_{x~}}\times S{{\prime }_{y}}={{S}_{x}}\times {{S}_{y}}+{{R}_{x}}\left( n\times {{S}_{y}} \right)+{{R}_{y}}\left( {{S}_{x}}\times n \right),$ |
式中Rx(n×Sy)和Ry(Sx×n)為法向量N的擾動項,將擾動后的法向量N單位化,并在光照模型中產生擾動作用。圖 3則表示產生物體表面粗糙感的過程,它是通過擾動函數改變法向量來實現的。

(a)光滑表面
(a) the original normal vector N of smooth surface
簡單網格圖案,字母圖案Z緩沖器圖案和隨意手繪的花紋圖案經過數學定義都曾經被Blinn用來作為擾動,該紋理擾動函數R(x,y)為可求導的任意函數,當R(x,y)不能用數學方法定義時,也可用一個二維(x,y)查詢表給出若干離散點的擾動函數值,再用雙線性插值法求得其它點處的擾動函數值,而偏導數則可用有限差分法來求。圖 4則是根據上述原理所繪制的兩個凹凸紋理映射實例。其中左圖為模擬一維正弦函數構造的凹凸紋理以及遍布表面的細小凹凸紋理,該紋理用于模擬物體材料表面的粗糙感。其擾動函數為
$S\left( x,y \right)=Asin(x/T),$ |
其中A為擾動幅度,T為擾動周期,該表面是在原來平面的法向量的基礎上疊加了一個沿x方向的擾動項Sx(x,y)=A/Tcos(x/T),再利用隨機數t的正弦值sin(t)對平面進行小幅度的不規則擾動形成其中細小的凹凸紋理。
圖 4的右圖模擬的是一個二維凹凸紋理,在一個平面上形成在兩個相互垂直的方向上同時起伏變化的凹凸,即擾動后的表面法向量等于原來平面的法向量上疊加一個沿x方向的擾動項A1cos(x/T1)和y方向的擾動項A2cos(x/Y1+y/T2)動項,可用來模擬光滑表面的凹凸感[6]。

法線凹凸紋理映射技術并不改變物體實際的幾何造型,而是在法線圖中保存每個頂點的法線值,并替換物體表面各頂點的實際法線向量為每個三角面片上的每個像素賦予虛擬的法線,而不需要由高度圖經過一系列的變換而求得每個頂點的法線,使計算的時間大大縮短。因此,光線反射是按照虛擬的法線計算出來,并不是按照真正的平面三角形法線計算,這樣可以使得一塊并非真實凹凸的區域看起來具有“三維”的感覺。為使渲染出來的效果更加真實,在該技術中的光線不僅包含漫反射分量,還添加了鏡面高光分量,在視點固定的情況下觀察到的效果相當好;另外,為了進一步提高繪制速度,可以借助于shader 編程來實現法線凹凸紋理映射技術。
為了使物體表面能夠呈現出逼真的凹凸感,模型表面的光線反射方向也應具有很大的隨機性,而在計算機圖像處理中,凹凸紋理映射是借助于光照模型來實現的,物體表面某點的亮度是通過該點法向矢量的函數來表達,因此,改變了物體表面的法向矢量,就能夠改變物體表面的亮度,進一步造成物體表面的凹凸現象。若對物體頂點的法向量進行改變,則需將物體坐標、法向矢量、光線矢量統一在一個坐標系中,也就是需要建立一個“切空間”。如圖 5所示。
建立好切空間后,利用公式(10)[7]將光線矢量投影到切空間中,為每個頂點計算相對于切空間的光線向量。
$~[{{L}_{relx}}~{{L}_{rely}}~{{L}_{relz}}\left] = \right[{{L}_{x}}~{{L}_{y}}~{{L}_{z}}]\times {{M}_{n}}$ |
其中[Lrelx Lrely Lrelz]是相對于頂點切空間的光線向量,在進行凹凸貼圖時要用,作為法線矢量的偏移量,與原法線矢量相加引起法線偏移,從而產生凹凸紋理。

2 法線式凹凸紋理映射技術的應用
2.1 簡單擾動函數生成的紋理
本文模型的建立是在生物器官模型可視化原型系統[3]上實現的。該系統由生物器官模型構建課題組在Microsoft Visual Studio VC++.NET 2003集成開發環境下研究開發,利用OpenGL編程實現。其功能模塊主要有文件的輸入輸出及保存、紋理的添加與變換、模型的操作以及模型顯示方法等。
本文實驗對象為胃模型,其特點為結構相對簡單,只有一個空腔,而且胃壁的厚度比較均勻,內部有不規則的褶皺。建立雙層胃模型,其厚度可根據醫生的判斷進行改變。首先建立一個具有厚度的胃模型,該生物器官模型具有內外兩層表面,由于對模型的數據采集過程中已經將外表面的凹凸表現出來,因此對其外表面只進行顏色紋理映射即可。而內表面是由系統生成的一個光滑的表面,因此還需要進行凹凸映射。
在該實驗中,選擇擾動函數是關鍵。按照之前的理論,在一維凹凸紋理映射和二維凹凸紋理映射中,選擇余弦函數S(x,y)=Asin(x/T)作為擾動函數,即可得到有凹凸感的視覺效果,將此函數運用到胃模型后,得到如圖 6所示的結果。

由圖 6可見,由于函數形式單一,使得該函數在自由曲面上造成的擾動形式單調,形成的凹凸紋理大規則,所以盡管凹凸感很強烈,但其效果并不接近于真實模型,故擾動函數仍需改進。
2.2 改進后的擾動函數生成的紋理
下面對采用的法線式凹凸紋理映射作進一步改善。
已知每個表面的法線信息,還需要追加兩個矢量到頂點法線以便定義一個平面,法線、切向矢量、及第二切向矢量(副法線)組成的 “切空間”。切空間主要是一個向量的集合,用以定義一個局部的坐標系統。擾動后的表面法向量等于原來平面的法向量上疊加一個沿x方向的擾動項A1cos(x/T1)和y方向的擾動項A2cos(x/Y1+y/T2),將表面的實際法線向量存儲在法線圖中,然后可以將含有法線的凹凸紋理和經過插值的光源向量在每個像素點結合起來,可以使用點乘,得到如圖 7所示結果。

(a)較小擾動;(b)較大擾動;(c)合適擾動
Figure7. The bump texture with different disturbance(a) small disturbance; (b) large disturbance; (c) appropriate disturbance
以上三幅圖的差別是由于設置了不同的法線擾動幅度A所得的。圖 7(a)中,由于設置的擾動幅度值比較小,為0.05,較小擾動使得內外紋理有變化但差別不大,并未達到預期的目的。圖 7(b)中由于將擾動幅度值設置為1.50,擾動過大,導致紋理顏色失真,仍未達到較好的效果。經過反復多次實驗,圖 7(c)中達到了預期的效果,此時的擾動幅度設為1.05,模型內壁顏色既不失真,又有凹凸不平的視覺效果,圖 8為其內壁凹凸映射放大了的細節圖。

通過以上實驗結果表明,凹凸映射能夠改變光滑的顏色紋理,在模擬真實物體粗糙的表面中,能展示很好的效果,提高了數字化模型的真實感。
3 結論與展望
在現階段,物體表面細節的關鍵問題之一為物體表面的幾何造型,物體表面的信息包含顏色、高度和材質信息等等。將盡可能多的信息快速有效地體現在物體表面上是紋理繪制的一個重要研究方向。因此,對復雜紋理繪制技術的研究方向有如下擴展:
(1)對于自然界中極不規則物體的表面進行紋理映射還沒有統一的數學模型可以應用,因此凹凸映射中的擾動函數還不具有普遍的應用能力。而擾動函數的選取對于三角面片構造的數字化模型的紋理影響比較大,如何尋找具有普遍應用價值的、有效的擾動函數是一項非常具有挑戰性的課題。
(2)對于內外表面具有不同的紋理的部分模型,如何分別進行紋理映射是BOV系統(生物器官模型可視化原型系統)需要進一步改進的方向,這需要改變程序中紋理映射的過程,對系統提出了更高的要求。