吳德道,劉小平
(1.南昌大學(xué)信息工程學(xué)院,江西 南昌 330031;2.景德鎮(zhèn)陶瓷大學(xué),江西 景德鎮(zhèn) 333000;3.卡爾頓大學(xué)系統(tǒng)與計(jì)算機(jī)工程系,渥太華 加拿大 K1S 5B6)
光線在虛擬手術(shù)中的場(chǎng)景視覺表現(xiàn),不僅在軟組織表面發(fā)生反射,還會(huì)產(chǎn)生散射,并可能進(jìn)入軟組織內(nèi)部,光線在這類材質(zhì)的物體中傳輸會(huì)經(jīng)過一次或多次的散射,最終可能從某個(gè)難以預(yù)知的出射點(diǎn)射出,也可能在軟組織內(nèi)被吸收。通常人們稱這種光線發(fā)生散射、吸收及衰減的現(xiàn)象為次表面散射(Sub-Surface Scattering,SSS)。為了表現(xiàn)這類半透明物體的次表面散射,眾多學(xué)者進(jìn)行了一系列的研究。準(zhǔn)確渲染半透明材料如皮膚表皮需要求解次表面散射方程,一種常用解析方法是用擴(kuò)散理論[1]。Munoz[2]提出基于單獨(dú)圖片的方法模擬BSSRDF,實(shí)現(xiàn)了一部分半透明材質(zhì)的真實(shí)感模擬。Jensen等[3-4]利用擴(kuò)散理論得到了BSSRDF的偶極擴(kuò)散近似,Donner和Jensen[5]將偶極近似擴(kuò)展到一個(gè)多極模型,該模型能更好地模擬多層材料中的光傳輸,因此比較適合包括皮膚等半透明材料外觀的視覺呈現(xiàn)。他們利用一種近似多層材料擴(kuò)散剖面的方法并使用測(cè)量到的散射參數(shù)計(jì)算了一個(gè)完整的三層人體皮膚模型。利用擴(kuò)散剖面,模擬次表面散射相當(dāng)于根據(jù)剖面的精確形狀將入射漫射光散射到鄰近位置。這將呈現(xiàn)一個(gè)逼真的軟組織半透明的外觀。但是偶極子和多極子模型對(duì)于實(shí)時(shí)應(yīng)用來(lái)說代價(jià)消耗巨大。
D’Eon[6,7]觀察到偶極子和多極子模型預(yù)測(cè)的擴(kuò)散剖面可以近似為高斯分布的加權(quán)和,從而可以實(shí)時(shí)計(jì)算次表面散射。因此,每個(gè)擴(kuò)散剖面都可以近似為高斯卷積的線性組合。次表面散射方程中的BSSRDF實(shí)際上表達(dá)了與徑向?qū)ΨQ不可分離擴(kuò)散剖面R(r)的二維表面卷積[7]。在紋理空間擴(kuò)散[8-9]中,通過將輻照度光柵化到紋理中,對(duì)該紋理應(yīng)用卷積操作,并將結(jié)果映射回網(wǎng)格來(lái)模擬這個(gè)過程。雖然紋理空間擴(kuò)散近似提供了實(shí)時(shí)視覺呈現(xiàn),但存在一些缺點(diǎn)。如運(yùn)行緩慢,為每一個(gè)半透明的物體在每一幀上計(jì)算一系列的輻照度卷積紋理代價(jià)相對(duì)昂貴,屏幕上有多個(gè)對(duì)象的情況下性能迅速下降。為了解決這些問題,Jimenez[11-12]提出將擴(kuò)散近似的評(píng)估從紋理空間轉(zhuǎn)化為屏幕空間,并將二維擴(kuò)散核分解為兩個(gè)一維核,避免了卷積紋理計(jì)算的開銷,實(shí)現(xiàn)了實(shí)時(shí)呈現(xiàn)效果。
針對(duì)人體軟組織在真實(shí)環(huán)境光照下的散色、透射及次表面散射不確定的特點(diǎn),本文提出了采用表面反射和次表面散射兩種光照模型組合的解決方法來(lái)模擬人體肝臟的真實(shí)光照表現(xiàn)。首先采用Kelemen/Szirmay-Kalos高光BRDF[13]計(jì)算鏡面反射,這是對(duì)Cook-Torrance反射模型的近似[14],考慮了來(lái)自各個(gè)方向的入射環(huán)境光,除了從陰影映射中提取單個(gè)樣本外,還檢索了最近的四個(gè)樣本。然后對(duì)所有深度測(cè)試的結(jié)果進(jìn)行雙線性插值,以確定光源可見樣本的百分比。為了實(shí)現(xiàn)實(shí)時(shí)呈現(xiàn)效果,利用擴(kuò)散剖面對(duì)輻照度進(jìn)行二維卷積,近似為高斯和并將二維擴(kuò)散核分解為兩個(gè)一維核,避免了卷積紋理計(jì)算的開銷。通過結(jié)合D’Eon等提出的變體紋理空間[6-7]和Jimenez等的屏幕空間半透明技術(shù)[15]實(shí)現(xiàn)肝臟組織邊緣較薄處透射的效果。實(shí)驗(yàn)結(jié)果表明,能逼真地模擬出人體肝臟的視覺外觀,且能保證模型在復(fù)雜渲染算法情況下的實(shí)時(shí)效率。
在軟組織次表面光照效果的研究中,本文主要利用了求解次表面散射方程來(lái)準(zhǔn)確渲染,以下是對(duì)有限介質(zhì)傳輸方程[16]的簡(jiǎn)化:
(1)
當(dāng)積分同時(shí)在A區(qū)域(被渲染表面上的點(diǎn))和入射方向w上時(shí),S(p,q,v,l)是一個(gè)雙向表面散射反射分布函數(shù)(BSSRDF)。這個(gè)函數(shù)將BRDF擴(kuò)展到考慮光從表面進(jìn)入的位置以外的其他位置的光,并給出了從位置p輻射到觀察方向v的光在位置q處從l方向入射光的比例:
(2)
通過使用BSSRDF而不是BRDF,我們能夠獲得一個(gè)柔和的軟組織外觀。求解次表面散射方程的一種常用解析方法是用擴(kuò)散理論[1]。Jensen等[3-4]利用擴(kuò)散理論得到了BSSRDF的偶極擴(kuò)散近似,該近似僅依賴于材料的散射特性,任意兩點(diǎn)p和q處的菲涅耳透射率Ft以及這兩點(diǎn)之間的距離存在以下關(guān)系:
(3)
上式中R(*)是材料的擴(kuò)散剖面,菲涅耳透射率描述了光從一種介質(zhì)傳輸?shù)搅硪环N介質(zhì)的量。1/π項(xiàng)描述的是射入的光量,它在p點(diǎn)周圍的半球上向一個(gè)方向v反射。Donner和Jensen[5]將偶極近似擴(kuò)展到一個(gè)多極模型并能模擬多層材料中的光傳輸,因此比較適合皮膚外觀的視覺呈現(xiàn)。利用擴(kuò)散剖面模擬次表面散射相當(dāng)于根據(jù)剖面的精確形狀將入射漫反射光散射到鄰近位置而產(chǎn)生柔和半透明的外觀,但偶極子和多極子模型對(duì)于實(shí)現(xiàn)實(shí)時(shí)效果的系統(tǒng)帶來(lái)巨大的負(fù)擔(dān)。
(1)D’Eon[6-7]觀察到偶極和多極模型預(yù)測(cè)的擴(kuò)散剖面可以近似為高斯分布的加權(quán)和,從而可以實(shí)時(shí)計(jì)算次表面散射。從擴(kuò)散剖面R(r)到高斯和的映射需要為k個(gè)高斯項(xiàng)找到合適的權(quán)值wi和方差vi:
(4)
上式中高斯項(xiàng)定義如下:
(5)
常數(shù)1/2πv保證每個(gè)高斯函數(shù)都有單位總擴(kuò)散響應(yīng),即高斯函數(shù)下的總面積等于1:
(6)
因此,每個(gè)擴(kuò)散剖面都可以近似為高斯卷積的線性組合。D’Eon等發(fā)現(xiàn)四種高斯分布足以對(duì)大多數(shù)單層材料進(jìn)行建模,并對(duì)Donner和Jensen的高加索皮膚三層模型提出了六個(gè)高斯項(xiàng)分布擬合,如表1所示,每個(gè)面的高斯權(quán)值之和為1,因?yàn)槠つw的顏色是由顏色映射定義的,而不是嵌入到擴(kuò)散面本身。D’Eon等描述了紅色通道的六個(gè)高斯信號(hào)也可以準(zhǔn)確地用于綠色和藍(lán)色通道,從而降低成本。
表1 六高斯項(xiàng)擬合三層皮膚模型[6]
次表面散射方程中的BSSRDF實(shí)際上表達(dá)了與徑向?qū)ΨQ不可分離擴(kuò)散剖面R(r)的二維表面卷積[7]。在紋理空間擴(kuò)散中[8-9],通過將輻照度光柵化到紋理中,對(duì)該紋理應(yīng)用卷積操作,并將結(jié)果映射回網(wǎng)格來(lái)模擬這個(gè)過程。理想形狀的模糊過濾器完全符合材料的擴(kuò)散剖面。雖然精確的擴(kuò)散剖面可以直接通過昂貴的二維卷積來(lái)計(jì)算,但是d’Eon等利用高斯函數(shù)的可分離性將其簡(jiǎn)化為一組代價(jià)更小的一維卷積。通過將不可分離的擴(kuò)散剖面表示為高斯和,可以對(duì)輻照度卷積進(jìn)行分層和分離評(píng)價(jià),得到一系列具有越來(lái)越寬模糊核的卷積輻照度紋理。這些卷積紋理的加權(quán)和然后近似的卷積輻照度的原始擴(kuò)散剖面。結(jié)合采樣的反照率和次表面散射將產(chǎn)生最終的半透明材料色調(diào)。
(2)次表面散射可以由反射和透射組成。當(dāng)入射光進(jìn)入材料的距離足夠遠(yuǎn),其中的一小部分會(huì)從材料的另一端出去時(shí),就會(huì)發(fā)生透射。材料的確切性質(zhì)將決定光在材料中傳播的距離和擴(kuò)散。因?yàn)槠つw有相對(duì)較高的吸收因子和平均散射因子,所以它既不是透明也不是不透明,而是半透明的。有些光可以通過耳朵和鼻子等皮膚的薄層甚至人體肝臟邊緣,但只能以高度擴(kuò)散的形式通過。在離線渲染領(lǐng)域,目前已有各種將半透明效果納入材質(zhì)呈現(xiàn)的方法中,Donner和Jensen推導(dǎo)出了計(jì)算透射剖面和反射剖面的方程[5]。對(duì)于實(shí)時(shí)渲染,一種考慮透射的方法是使用修改后的陰影貼圖。Jimenez實(shí)現(xiàn)了屏幕空間半透明技術(shù)[15],該技術(shù)基于d’Eon提出的變體紋理空間[6-7]。
(7)
卷積核R(r)的計(jì)算與前面一樣使用高斯和近似:
(8)
其中d=mcosθ是物體的局部厚度(如圖1)。
對(duì)肝臟進(jìn)行圖像三維重建后所得的數(shù)字化模型,如圖2所示,可觀察到對(duì)比實(shí)物原圖2(a),重建三維模型圖2(b)~(d)表面色澤真實(shí)感表現(xiàn)相對(duì)較不自然,這是由于模型表面紋理貼圖是圖像序列加權(quán)平均得到的,且模型表面不含任何光照信息。為復(fù)原真實(shí)肝臟所具有的光感表現(xiàn),首先分析半透明材質(zhì)中最顯著的次表面散射特性,但是直接用BSSRDF模型進(jìn)行模擬計(jì)算效率太低,故為保證實(shí)時(shí)渲染效率,采用[18]所提到的多層BRDF模型疊加的方法來(lái)模擬半透明模型具有的次表面散射表現(xiàn)。通過分析可知,肝臟組織主要具備高光、表面散射及邊緣組織較薄處透射的物理光學(xué)表現(xiàn),所以,本文提出了兩層光照模型線性疊加的方式來(lái)模擬半透明高光效果。
Cook-Torrance模型是一種基于物理的BRDF,它利用微面元理論來(lái)確定物體表面的粗糙度,并考慮了菲涅耳反射、微面元定向、微面間的相互遮擋和吸收光線。在d’Eon和Luebke[6]之后,利用Kelemen/Szirmay-Kalos高光BRDF[13]計(jì)算鏡面反射,這是對(duì)Cook-Torrance反射模型的近似[14],簡(jiǎn)化了幾何項(xiàng)(遮擋),使BRDF實(shí)時(shí)渲染效果更好:
(9)
上式中l(wèi)是光的方向,v是視場(chǎng)方向,h′=l+v;h=h′/|l+v|,h′是非歸一化半矢量,h是歸一化半矢量。D(n,h)是貝克曼正態(tài)分布函數(shù)[19],它描述了面向h的微面部分,有助于光從l方向反射到v方向:
(10)
上式中α是n和h之間的夾角,k是粗糙度系數(shù),而F(v,h)是菲涅耳反射項(xiàng),它描述了每個(gè)微面反射的光線數(shù)量。為了提高渲染器的性能,采納D’Eon和Luebke[6]的建議,預(yù)先計(jì)算并渲染Beckmann分布到一個(gè)8位的紋理映射中,然后在運(yùn)行時(shí)讀出。利用Schlick’s[20]計(jì)算菲涅耳反射項(xiàng):
FSchlick(F0,l,h)=F0+(1-F0)(1-(l·h)5)
(11)
除了鏡面反射,Kelemen/Szirmay-Kalos BRDF還包括漫反射部分。D’Eon和Leubke[6]描述了一種使用預(yù)先計(jì)算的紋理來(lái)增加節(jié)能的方法,而視覺效果可根據(jù)應(yīng)用程序的不同來(lái)評(píng)估。擴(kuò)散分量實(shí)際上一般被用作非常粗略的物體次表面散射近似[3]。本文選擇使用Lambertian漫反射,因?yàn)橹髮⒂梢粋€(gè)次表面散射著色器的修改。使用Kelemen/Szirmay-Kalos高光BRDF,從l方向的單光源出發(fā),在點(diǎn)p處向視場(chǎng)方向v的高光強(qiáng)度修改為:
LSpec(p,v)=kSpecDBeckmann(k,n,h)
(12)
上式中kSpec為全局高光強(qiáng)度因子,IL(p,l)為來(lái)自光源L的入射光,本文使用了聚光燈,因?yàn)樗^好地代表了現(xiàn)實(shí)生活中的燈光并有一個(gè)較簡(jiǎn)單的等式:
IL=cL·fattenuation·ffalloff
(13)
上式中cL為以RGB值表示的光的顏色,函數(shù)fattenuation和ffalloff根據(jù)到光源的距離確定光強(qiáng),漫反射方程與高光反射方程相似:
Ldiff(p,v)=calbedoIL(p,l)n·l
(14)
上式中calbedo是從提供漫反射物體表面顏色的顏色紋理映射中采樣的RGB值。最后,表面點(diǎn)的鏡面反射和漫反射直接為計(jì)算對(duì)每個(gè)光源的求和。
由于高光的亮度是由兩個(gè)因素來(lái)決定的:高光強(qiáng)度kSpec和粗糙度系數(shù)k。通過從一個(gè)雙通道高光紋理中采樣這些量并允許它們?cè)谀P偷谋砻孀兓?,從而提高高光部分的逼真度。此外,采樣一個(gè)法線貼圖來(lái)擾動(dòng)位于p點(diǎn)的表面法線n,如式(14)所示。像高光貼圖一樣,法線貼圖的添加允許我們改變表面的粗糙度,這樣就可以表現(xiàn)出軟組織表面更多的幾何微觀特征。
雖然紋理空間擴(kuò)散近似提供了實(shí)時(shí)視覺呈現(xiàn),但也存在一些缺點(diǎn)。比如運(yùn)行緩慢,為每一個(gè)半透明的物體在每一幀上計(jì)算一系列的輻照度卷積紋理仍然代價(jià)相對(duì)昂貴,導(dǎo)致在屏幕上有多個(gè)對(duì)象的情況下性能迅速下降。為了解決這些問題和其他方面的考慮,Jimenez等提出將擴(kuò)散近似的評(píng)估從紋理空間轉(zhuǎn)化為屏幕空間。在最近的工作中,他們提出了一種可分離屏幕空間擴(kuò)散近似方法。本文的渲染器實(shí)現(xiàn)了[11-12]中描述的次表面散射技術(shù)。因?yàn)樵摲椒閷?shí)時(shí)物體表面呈現(xiàn)提供了一種高性能的解決方案,可以很容易地集成為一個(gè)后處理著色器。
3.2.1 簡(jiǎn)化可分離次表面散射的實(shí)現(xiàn)
為了實(shí)現(xiàn)實(shí)時(shí)呈現(xiàn)效果,擴(kuò)散剖面對(duì)輻照度進(jìn)行二維卷積,近似為高斯和。Jimenez等[11-12]提出了一種新的方法,將二維擴(kuò)散核分解為兩個(gè)一維核,避免了卷積紋理計(jì)算的開銷。定義一個(gè)可分離的一維濾波器S[x,y],將二維擴(kuò)散核S分解為代價(jià)更少的水平和垂直一維核S[x]:
S[x,y]≈S[x]×ST[y]
(15)
上式中,[x,y]是樣本位置,ST[y]是S[y]的轉(zhuǎn)置。由于擴(kuò)散剖面的徑向?qū)ΨQ性,方便利用轉(zhuǎn)置濾波器。濾波器S[x]定義為初始擴(kuò)散剖面p[x]的函數(shù),并將其參數(shù)化,使其更適合于精確的目標(biāo)擴(kuò)散剖面:
(16)
寬度k定義了以世界空間為單位的次表面散射核的全局寬度。強(qiáng)度t指定有多少擴(kuò)散光穿透表面,因此將被次表面散射所改變。它是原始未濾波圖像與模糊圖像的混合因子。f定義了梯度隨距離變化的形狀。大的衰減使形狀更寬,而小的衰減使形狀更窄。寬度是標(biāo)量,在R、G、B通道上是均勻的,而強(qiáng)度和衰減根據(jù)每個(gè)通道來(lái)定義。
使用可分離擴(kuò)散核的渲染簡(jiǎn)化為在渲染的漫反射圖像上應(yīng)用一個(gè)雙通卷積濾波器。為了與一維核函數(shù)s[x]進(jìn)行卷積,需要對(duì)核函數(shù)進(jìn)行離散化。這是通過計(jì)算中心位置附近的樣本偏移量X,以及基于初始輪廓、強(qiáng)度和衰減參數(shù)的每個(gè)樣本的譜權(quán)W來(lái)實(shí)現(xiàn)的??紤]到渲染的實(shí)時(shí)性和對(duì)視覺的影響程度,本文使用9個(gè)樣本。樣本偏移量X可以通過在核范圍內(nèi)均勻地間隔來(lái)計(jì)算,然后用指數(shù)函數(shù)對(duì)其進(jìn)行修正,從而使越靠近中心的樣本越具有高的重要性。核范圍定義了采樣擴(kuò)散剖面p[x]時(shí)x的最大范圍,從而影響離散化過程的精度。對(duì)于n個(gè)樣本的初始等間距偏移量集計(jì)算為:
(17)
其中r是核函數(shù)范圍的一半。比如n=9,r=2得到:
{-2.0,-1.5,-1.0,-0.5,0.0,0.5,1.0,1.5,2.0}
計(jì)算核權(quán)值W的集合要求我們首先計(jì)算修改后的剖面p[x]=R(r),其中r=x∈X是樣本偏移量。剖面在每個(gè)采樣點(diǎn)返回每個(gè)通道的漫反射系數(shù)。如前所述,對(duì)于三層皮膚模型,采用六高斯和的紅色通道進(jìn)行離散化,并通過強(qiáng)度和衰減參數(shù)進(jìn)行參數(shù)化。以下是一個(gè)直接實(shí)現(xiàn)的函數(shù):
(18)
其中r=x,高斯項(xiàng)k=6,各個(gè)高斯權(quán)值wi和方差vi由以下集合定義(可參見表1中紅色通道的權(quán)值和方差):
wi∈{0.233,0.100,0.118,0.113,0.358,0.078}
vi∈{0.0484,0.187,0.567,1.99,7.41}
第一個(gè)高斯函數(shù)可以考慮直接表示散射光,由于它的方差很小,因此可以忽略,這樣高斯項(xiàng)減少到k-1。實(shí)際高斯函數(shù)的計(jì)算公式如下:
(19)
這類似于d’Eon等描述的高斯函數(shù),但現(xiàn)在包含了半徑r除以衰減f,允許高斯函數(shù)的形狀發(fā)生變化。較大的衰減值使高斯曲線變寬,較小的衰減值使高斯曲線變窄。每一個(gè)顏色通道衰減值的范圍從0到1并且為防止除0加上了一個(gè)ε=0.001。
通過計(jì)算內(nèi)核偏移量和內(nèi)核權(quán)值可以使用可分離的子表面散射像素著色器將實(shí)際的濾波器應(yīng)用于屏幕空間圖像;可見算法1。內(nèi)核的最終大小(以世界空間單位為單位)與像素的投影表面積有關(guān),后者取決于像素的深度和表面方向。在第4行和第5行,根據(jù)當(dāng)前像素的深度確定內(nèi)核的比例。這個(gè)值可以看作像素的大小,通過將到圖像平面的距離除以深度緩沖區(qū)中存儲(chǔ)的深度值d得到:
(20)
其中θf(wàn)ovy是用攝像機(jī)觀查場(chǎng)景的垂直視域。計(jì)算這個(gè)角的一半的余切就得到了從相機(jī)原點(diǎn)到圖像平面的距離(見圖3)。對(duì)于位于圖像平面上的像素,scale為1.0,隨著距離的增加而減小。在第6行計(jì)算采樣期步長(zhǎng),它是scale與全局散射寬度w以及一個(gè)二維方向向量的乘積,該方向指向水平方向(1,0)或垂直方向(0,1)取決于這是過濾器的第一遍還是第二遍,然后除以樣本偏移量的半范圍r,使其在[0,1]范圍內(nèi)。
算法1可分離次表面散射像素著色器偽碼
function:ssssps(texcoord,kernel,width,nsamples,range,fovy,direction,colormap,depthmap)
1:Initialize result=float4(0,0,0,1)
2:color←colormap.Sample(point,texcoord)
3:depth←depthmap(point,texcoord).r
4:projdist←1.0/tan(0.5* radians(fovy))
5:scale←projdist/depth
6:step←scale*width*direction/range
7:fori++ 8:if i is nsamples then 9:result.rgb←result.rgb+color.rgb*kernel[nsamples/2].rgb 10:end if 11:offset←texcoord+kernel[i].a*step 12:tap←colormap.Sample(linear,offset) 13:d←depthmap.Sample(linear,offset).r 14:s←saturate(300.0*projdist*width*abs(depth-d)) 15:tap←lerp(tap,color.rgb,s) 16:result.rgb←result.rgb+kernel[i].rgb*tap.rgb 16:end for 16:return result 17:end function 計(jì)算實(shí)際的擴(kuò)散卷積需要積累每個(gè)樣本的貢獻(xiàn)。對(duì)于中心樣本,只需要計(jì)算從顏色圖中提取的皮膚顏色和中心內(nèi)核權(quán)重的乘積。其他樣本的顏色貢獻(xiàn)是通過對(duì)顏色圖中鄰近的紋理進(jìn)行采樣來(lái)確定的,從而有效地將鄰近位置的顏色滲到著色器處理的目標(biāo)像素中。線性抽樣是用來(lái)提高圖像質(zhì)量的,增加樣本的數(shù)量會(huì)得到更逼真的效果。算法1是分離的次表面散射像素著色器的偽代碼,當(dāng)距離大于擴(kuò)散剖面時(shí),用原始像素顏色對(duì)樣本的貢獻(xiàn)進(jìn)行線性插值,消除了相鄰樣本與卷積中心之間的較大深度變化。這將減少屏幕空間中距離較近但物體空間較遠(yuǎn)的位置之間不必要的顏色滲出,迫使卷積更精確地跟隨3D模型的表面。在算法1第14行300.0的修正值是一個(gè)經(jīng)驗(yàn)確定的量。表面渲染器應(yīng)用可分離的子表面散射像素著色器作為漫反射圖像的后處理過濾器。第一遍計(jì)算水平方向上的卷積,第二遍計(jì)算垂直方向上的卷積。由于次表面散射只適用于漫反射組件,為了避免模糊,在最終渲染過程中,將之前計(jì)算的高光組件分離并添加進(jìn)來(lái)。 3.2.2 透光率計(jì)算 Jimenez等[15]提出了一種計(jì)算屏幕空間擴(kuò)散的半透明度的解決方案,其工作原理類似于紋理空間方法。在屏幕空間中面臨的主要問題是物體背面表面點(diǎn)的信息更少(從相機(jī)的角度來(lái)看),而半透明問題相當(dāng)于求解下面的方程: (21) 穿過物體的距離d仍可以從陰影貼圖中得到。然而,在屏幕空間中無(wú)法獲得面向光表面上xin點(diǎn)處的入射輻照度E(xin)。因此引入了一些假設(shè)來(lái)近似輻照度。 首先,將x點(diǎn)處的法線替換為陰影處的反向法線:Nin=-Nout。其次,前面的反照率αout(從相機(jī)的視角)是用來(lái)近似后面的反照率。這是因?yàn)槠つw的表面反射率通常不會(huì)有很大的變化。此外,假設(shè)光照面的輻照度近似為局部常數(shù),使得x點(diǎn)附近的所有采樣點(diǎn)與x點(diǎn)本身(E(xin)=E)值相同,且: E=αoutmax(0,Nout·L) (22) 其中L是光向量。根據(jù)這個(gè)假設(shè)有: (23) 利用d’Eon的高斯和近似,考慮到高斯信號(hào)具有單位總擴(kuò)散響應(yīng),M(x,y)簡(jiǎn)化為(推導(dǎo)見文獻(xiàn)[15]): (24) 為了降低計(jì)算復(fù)雜度,d近似為s(見圖1),通過將點(diǎn)xout轉(zhuǎn)換為光空間并從該點(diǎn)的存儲(chǔ)深度值中減去而得到。以下是一個(gè)基于物理的函數(shù)T(s),它將光強(qiáng)度的衰減與物體內(nèi)部移動(dòng)的距離聯(lián)系起來(lái): (25) 這個(gè)函數(shù)可以預(yù)先計(jì)算并存儲(chǔ)為衰減紋理,或者直接在著色器中計(jì)算。在表面渲染器中選擇后者,因?yàn)橹苯佑?jì)算通常比訪問紋理內(nèi)存快并節(jié)省內(nèi)存。 實(shí)現(xiàn)半透明的像素著色器偽代碼如算法2所示。前6行偽代碼計(jì)算了xin(d1)處的深度值和xout(d2)處的深度值,并得出它們的差值等于距離s。使用陰影映射進(jìn)行深度值近似導(dǎo)致在將背景像素投影到對(duì)象上時(shí),對(duì)象邊緣的精確度不夠。在從陰影映射查詢深度值時(shí)(第3行),為確保所有采樣點(diǎn)都在觀察視角,樣本位置在表面法線方向上少量收縮(第2行)。在陰影映射中找到正確的樣本位置需要手動(dòng)執(zhí)行透視圖轉(zhuǎn)換(第3行)。光透射距離是由兩個(gè)參數(shù)決定的,這兩個(gè)參數(shù)決定了透射的強(qiáng)度。首先是散射濾波器在世界空間單位上的寬度。這個(gè)參數(shù)之前用于次表面反射濾波器。另外一個(gè)參數(shù),半透明因子是一個(gè)從0到1的值,它直接控制透射效應(yīng)的強(qiáng)度。距離8.25的經(jīng)驗(yàn)值使得透光率變得明顯。第7~10行使用表1的高斯和近似計(jì)算距離s對(duì)應(yīng)的顏色。將輻照度E近似為上文所述,通過將陰影點(diǎn)處光源強(qiáng)度乘以M(x,y)=ET(s)得到總透光度,對(duì)給定像素的每個(gè)光源均是如此獲得總透光度。 算法2透光率計(jì)算偽碼 function:transmittance(worldpos,normal,lightdir,shadowmap,viewproj,farplane,spotlight,albedo) 1:Initialize Ts=float3(0,0,0) 2:pos←float4(worldpos-0.005*normal,1.0) 3:lightpos←mul(pos,viewproj) 4:d1←shadowmap.Sample(linear,lightpos.xy/lightpos.w).r*farplane 5:d2←lightpos.z 6:s←(8.25*(1.0-Translucency)/ScatterWidth)*abs(d1-d2) 7:ss=-s*s 8:for i++<6 do 9:Ts←Ts+float3(redi,greeni,bluei)*exp(ss/vari) 10:end for 11:E←saturate(0.3+dot(-normal,lightdir)) 12:return E*Ts*spotlight*albedo 13:end function 實(shí)驗(yàn)環(huán)境配置為CPU為Intel core i5 5200,內(nèi)存4 GB,顯卡為AMD Radeon R5 M320的便攜計(jì)算機(jī)上進(jìn)行了渲染實(shí)驗(yàn);使用3ds Max 2014版本作為渲染工具,Shader語(yǔ)言為CG。實(shí)驗(yàn)用例皆為實(shí)際的肝臟經(jīng)圖像三維重建后得到的數(shù)字化模型。 第1組實(shí)驗(yàn)對(duì)象是圖2(a)在經(jīng)圖像重建后得到的肝臟三維幾何模型,如圖2(b)、(c)、(d)所示,實(shí)驗(yàn)中首先得到的是如圖4所示真實(shí)肝臟經(jīng)重建后所得貼圖,之后利用本文方法進(jìn)行渲染實(shí)驗(yàn),在渲染過程中,每一步的繪制實(shí)驗(yàn)圖如圖5所示。 通過上圖肝臟模型渲染的過程,在添加紋理后只有二維平面效果,而增加法線貼圖后才有了立體效果,通過表面高光以及配合的環(huán)境光的表現(xiàn)使得模型具有了自然光照的屬性特點(diǎn),增加陰影自遮擋效果使得模型表面有了坑洼的增強(qiáng)立體感,然后通過算法1實(shí)現(xiàn)的模型次表面散射使其具有了柔和的人體組織視覺特點(diǎn),最后通過算法2實(shí)現(xiàn)光在肝臟較薄和邊緣處的透射以高真實(shí)感的呈現(xiàn)其半透明的視覺效果。 本文提出的方法是分兩層光照模型疊加模擬最終的結(jié)果,通過第一組最終實(shí)驗(yàn)結(jié)果如圖5與采用3Dmax渲染的模型如圖2(b)、(c)、(d)的比較,采用本文提出的方法渲染的肝臟模型更接近現(xiàn)實(shí)如圖2(a)。而對(duì)重建模型漫反射層的比較如圖6第二組實(shí)驗(yàn)所示,由此看出經(jīng)典方法需配合環(huán)境光照來(lái)表現(xiàn)更多的模型細(xì)節(jié)。 第三組實(shí)驗(yàn)如表2展示出在肝臟模型面片數(shù)為3968的情況下利用本文渲染方法達(dá)到的幀速率。通常12 frame·s-1的幀速率為人眼所達(dá)到實(shí)時(shí)交互的最低的幀速率,而如表2中本文渲染速率,當(dāng)采用次表面散射方法渲染模型時(shí),其渲染的幀速率依然可以在90 frame·s-1左右,為人眼實(shí)時(shí)最低速率的7.5倍。所以本文實(shí)驗(yàn)方法保證了實(shí)時(shí)渲染的需要。綜合圖5實(shí)驗(yàn)可得,本文方法可實(shí)現(xiàn)基于次表面散射重建肝臟模型高真實(shí)感實(shí)時(shí)渲染。 表2 依次增加的渲染過程及所對(duì)應(yīng)的幀速率 本文在實(shí)現(xiàn)人體肝臟圖像三維重建后的真實(shí)感光照實(shí)時(shí)渲染問題上,提出利用表面反射和次表面散射光照模型結(jié)合的方法模擬表面高光及散、透射表現(xiàn)。通過從一個(gè)雙通道高光紋理中采樣光強(qiáng)度和粗糙度系數(shù)并允許它們?cè)谀P偷谋砻孀兓瑥亩岣吒吖獠糠值谋普娑?。此外,采用法線貼圖、陰影遮擋貼圖以及位移貼圖來(lái)改變肝臟表面的粗糙度以表現(xiàn)更多的幾何微觀特征和增強(qiáng)立體視覺。采用Kelemen/Szirmay-Kalos高光BRDF計(jì)算鏡面反射并考慮了來(lái)自各個(gè)方向的入射環(huán)境光,使得渲染的肝臟模型更接近自然光照的視覺呈現(xiàn)。為了實(shí)現(xiàn)實(shí)時(shí)呈現(xiàn)效果,利用擴(kuò)散剖面對(duì)輻照度進(jìn)行二維卷積,近似為高斯和并將二維擴(kuò)散核分解為兩個(gè)一維核,避免了卷積紋理計(jì)算的開銷。通過結(jié)合紋理空間和屏幕空間半透明技術(shù)實(shí)現(xiàn)肝臟組織邊緣較薄處光線透射的效果。實(shí)驗(yàn)結(jié)果表明,本文方法能逼真地模擬出人體肝臟的視覺外觀,且能保證模型在復(fù)雜渲染算法情況下的實(shí)時(shí)效率。4 實(shí)驗(yàn)結(jié)果與分析
4.1 實(shí)驗(yàn)渲染結(jié)果分析
4.2 實(shí)驗(yàn)結(jié)果對(duì)比分析
4.3 渲染效率分析
5 結(jié)語(yǔ)