楊欣
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610025)
在虛擬現(xiàn)實(shí)技術(shù)日益發(fā)展的過(guò)程中,流體渲染已逐漸成為一個(gè)研究熱點(diǎn)。目前,基于網(wǎng)格和基于粒子的流體模擬是計(jì)算機(jī)圖形學(xué)的兩大分類,而流體作為粒子是更方便地去整合它所處的物理系統(tǒng)的,如每個(gè)粒子都有自己的位置、壓力、密度、速度等屬性,正因?yàn)橛羞@些屬性使得流體更加真實(shí);;也正是因?yàn)槿绱耍交W恿黧w力學(xué)(Smoothed Particle Hydrodynamics,SPH)方法使得我們更難去提取或定義流體的表面,針對(duì)基于粒子模擬的流體的渲染方法是很少的,并且大部分都并非實(shí)時(shí)。
在采用平滑粒子流體力學(xué)方法已經(jīng)模擬出流體的前提下,本文的輸入數(shù)據(jù)為粒子pi的位置xi,甚至也可以包括速度vi和密度ρi,分為四個(gè)步驟完成渲染:第一個(gè)繪制遍根據(jù)位置,表面深度,厚度得到深度圖;第一個(gè)繪制遍生成厚度圖;第三個(gè)繪制遍采用曲率流進(jìn)行對(duì)表面深度平滑處理;第四個(gè)繪制遍渲染場(chǎng)景天空盒背景;最后一個(gè)整合繪制遍進(jìn)行光照處理。
通常來(lái)說(shuō),流體的表面是定義在世界空間下,要么是作為網(wǎng)格直接定義[1],要么是用Marching Cubes多邊形化之后定義的隱式表面[2]。但是實(shí)際上每一幀流體的移動(dòng)和渲染都取決于視點(diǎn),故在視點(diǎn)坐標(biāo)系下去定義表面是更利于有效計(jì)算的[3],故本文的一個(gè)核心在于是在視點(diǎn)空間進(jìn)行渲染處理,如圖1。
圖1 表面
點(diǎn)精靈是使用片元著色器渲染的OpenGL點(diǎn),運(yùn)行的時(shí)候考慮點(diǎn)內(nèi)的片元坐標(biāo),其坐標(biāo)是兩維向量gl_PointCoord,可以任意使用這個(gè)變量,特別之處在于一個(gè)頂點(diǎn)也可以貼紋理。
點(diǎn)精靈的局限在于一個(gè)頂點(diǎn)縮放都必須是矩形,并且其最大最小值是有范圍的,故如果要使點(diǎn)精靈表現(xiàn)為球體,通過(guò)公式(1)和(2)計(jì)算得到的N的長(zhǎng)度如果大于1,則discard來(lái)將立方體變?yōu)榍蝮w:
每一幀的攝像機(jī)位置視點(diǎn)決定了流體的表面,將每一個(gè)粒子渲染為球體,通過(guò)硬件深度測(cè)試來(lái)獲取每個(gè)像素后面離近平面最近的深度值作為表面值。為了能夠獲取視點(diǎn)下流體的表面,我們采用點(diǎn)精靈技術(shù),在片元著色器中將深度寫入到離線緩存。我們僅僅需要存儲(chǔ)深度即可,而不需要存儲(chǔ)顏色,而深度信息則是后續(xù)的平滑處理以及法線計(jì)算所需要用到的輸入數(shù)據(jù)。渲染的深度圖如圖2、圖3、圖4。
圖2 4000粒子深度圖
圖3 8000粒子深度圖
圖4 16000粒子深度圖
對(duì)流體表面的平滑處理最常見的方法是高斯模糊及其變體形式,如雙向高斯濾波[4]。高斯模糊的平滑方式會(huì)使得流體的邊緣出現(xiàn)影子,輪廓邊緣顯得更暗;雙向高斯濾波處理對(duì)邊界的處理會(huì)好很多,但是不可分割的,因此代價(jià)消耗比較昂貴。
本文采用曲率流(curvature flow)[5]實(shí)現(xiàn)了在屏幕空間平滑流體的表面。該方法的出發(fā)點(diǎn)在于當(dāng)流體流動(dòng)的時(shí)候,主要處理粒子間的曲率來(lái)形成平滑且連續(xù)的表面。曲率流沿著它的法線方向演化成一個(gè)表面,其演化速度取決于表面的平均曲率大小和正負(fù)。雖然我們只操作垂直于視點(diǎn)平面的z軸方向,但我們可以通過(guò)對(duì)于曲率的比例,改變z值來(lái)達(dá)到我們想要的平滑效果。因此,我們?nèi)缦露x:
其中,t是平滑迭代次數(shù),H是平均曲率;H平均曲率定義為表面的單位法向量的散度。
其中,通過(guò)投影矩陣的逆矩陣可以將一個(gè)粒子映射到視點(diǎn)空間下的P;Vx,Vy是視口參數(shù);Fx,F(xiàn)y分別是x和y方向上的焦距。
其中,
法線是由P在x和y方向上的導(dǎo)數(shù)的叉乘所得到。為了簡(jiǎn)化公式(6),我們忽略P依賴于視點(diǎn)位置Wx,Wy的因素式,實(shí)際上此因素式的作用微不足道,故我們可以得到單位向量公式如下:
由于z是x,y表示的函數(shù),散度的z分量總是零,再結(jié)合公式(4),推出H的公式:
其中,
為了防止流體邊緣表面的不連續(xù)混合,在深度會(huì)發(fā)生驟變的兩像素邊界以及屏幕的邊界處,我們強(qiáng)制使得空間散度為零。
每個(gè)迭代,公式(3)的簡(jiǎn)單歐拉積分都用來(lái)修改了z值,z值的空間散度用有限差分計(jì)算而得。迭代的次數(shù)依賴于想要的平滑效果所設(shè)定,迭代次數(shù)越多,效果更平滑,但同時(shí)計(jì)算量也會(huì)更大[4]。
厚度是用來(lái)表示每個(gè)像素點(diǎn)處的流體量。為了達(dá)到這種半透明漸變效果,針對(duì)每一個(gè)像素,計(jì)算得出攝像機(jī)和最近的透明物體的數(shù)量。在繪制的時(shí)候和第一個(gè)繪制遍一致,但不同的是需要開啟混合,存儲(chǔ)厚度到幀緩存中,而不是之前的深度。開啟混合的作用則是去累加屏幕中每個(gè)位置的流體量。開啟深度測(cè)試,保證只渲染在場(chǎng)景中最前方的流體。此厚度的有效性是在粒子沒(méi)有重疊的情況下成立,而正好平滑粒子流體力學(xué)(SPH)模擬方法能保證這一點(diǎn)。
實(shí)現(xiàn)天空盒背景的主要技術(shù)是使用立方體映射紋理技術(shù),而使用天空盒背景的目的在于體現(xiàn)流體的反射效果。
首先,立方體映射紋理是一種特殊類型的紋理,用于環(huán)境映射,使用6個(gè)正方形的并且大小相同的子紋理作為立方體映射的6個(gè)面,如圖5。通過(guò)將一個(gè)紋理綁定到gl_TEXTURE_CUBE_MAP紋理目標(biāo),并在gl_TEXTURE_CUBE_MAP目標(biāo)上調(diào)用glTexStorage2D()可以為立方體映射紋理分配存儲(chǔ)空間。分配存儲(chǔ)空間后,立方體映射用6個(gè)特殊目標(biāo)的集合表示,分別是GL_TEXTURE_CUBE_MAP_POSITIVE_X、GL_TEXTURE_CUBE_MAP_NEGATIVCE_X、GL_TEXTURE_CUBE_MAP_POSITIVE_Y、GL_TEXTURE_CUBE_MAP_NEGATIVE_Y、GL_TEXTURE_CUBE_MAP_POSITIVE_Z,GL_TEXTURE_CUBE_MAP_NEGATIVE_Z。
圖5 Cubemap六張紋理圖
在立方體映射中采樣的時(shí)候,使用的紋理坐標(biāo)是三維且看作來(lái)自原點(diǎn)的方向,方向指向用來(lái)讀取紋理的立方體映射表面的位置。立方體映射對(duì)于表示周圍環(huán)境、光和反射效果是很完美的。在第四個(gè)繪制遍的時(shí)候繪制出的天空盒背景,在最后一個(gè)繪制遍整合的時(shí)候,在片元著色器中可以通過(guò)內(nèi)置函數(shù)reflect(Inci?dentLight,Normal)得到的結(jié)果去采取立方體映射的紋素來(lái)達(dá)到反射的效果。
在最后一個(gè)繪制遍,將之前繪制遍渲染的幀緩存(深度圖、厚度圖、法線圖等)做最后的整合處理,來(lái)得到最終的效果。本繪制遍主要做光照處理,其中包括馮氏光照和菲涅爾反射。
馮氏光照模型主要由環(huán)境(Ambient)光照、漫反射(Diffuse)光照、鏡面(Specular)光照構(gòu)成。
環(huán)境光照使物體永遠(yuǎn)不會(huì)是完全黑暗的,在現(xiàn)實(shí)生活中環(huán)境光只是平行光找到其他物體上;漫反射光照和觀察者的角度無(wú)關(guān),但其是馮氏光照模型最顯著的組成部分,決定了物體的主要顏色;鏡面反射光照是模擬有光澤物體上面出現(xiàn)的亮點(diǎn),使其更傾向于光的顏色,此光照與視角和材質(zhì)光澤度(Shininess)有關(guān)。結(jié)合三種光照元素,構(gòu)成的馮氏光照公式如下:
圖6 4000粒子,30次曲率流迭代
其中,AStrength是環(huán)境光系數(shù);LightColor是光的主顏色;Ambient是環(huán)境光分量;Normal是物體表面的法線;LightDir是光的方向,即物體到光源的向量;Dif?fuse是漫反射分量;SStrength是鏡面強(qiáng)度;ViewDir是物體到眼睛的向量;ReflectDir則是LightDir基于Nor?mal的反射向量;Shininess是高光的反光度。
菲涅爾反射所反映的現(xiàn)象在于流體表面在棱角尖銳處反射更強(qiáng)烈。換言之,視線垂直于表面時(shí),反射較弱;視線飛垂直表面時(shí),夾角越小,反射越明顯。在渲染中采用了近似處理,公式如下:
其中,θ是入射角;R0是反射率;cosθ是法線和視線向量的點(diǎn)乘。
實(shí)驗(yàn)針對(duì)平滑粒子流體力學(xué)模擬出來(lái)的流體,僅僅針對(duì)其渲染做出實(shí)驗(yàn)。實(shí)驗(yàn)控制兩個(gè)變量,一是粒子數(shù)量,一是曲率流平滑處理迭代次數(shù)。針對(duì)這兩個(gè)變量的取值,分別做了6個(gè)實(shí)驗(yàn),如圖6-11。
圖7 4000粒子,60次曲率流迭代
圖8 8000粒子,30次曲率流迭代
圖9 8000粒子,60次曲率流迭代
圖10 16000粒子,30次曲率流迭代
從上述實(shí)驗(yàn)可以看到,粒子數(shù)量越多,渲染的流體密度更為密集,稀疏度更真實(shí);曲率流迭代次數(shù)越多,流體表面更加光滑,顆粒感越不明顯。
本文針對(duì)粒子化流體進(jìn)行實(shí)時(shí)渲染,采用了點(diǎn)精靈將粒子球體化,使得可以簡(jiǎn)單地捕捉流體的表面;進(jìn)一步通過(guò)可以控制迭代次數(shù)的曲率流平滑處理流體,使其更加真實(shí);最后為流體增加天空盒和菲涅爾反射效果,結(jié)合馮氏光照模型渲染處最終效果。布料模擬方法采用預(yù)計(jì)算處理彈簧質(zhì)點(diǎn)模型數(shù)據(jù)。在兼顧真實(shí)感的同時(shí),對(duì)繪制效率也有較好的提升,能夠被運(yùn)用于電子游戲,電影動(dòng)畫產(chǎn)業(yè)中。但同時(shí),本文未對(duì)流體加入噪聲、焦散、陰影等更為細(xì)節(jié)的研究,需要在接下來(lái)的工作中進(jìn)行研究和完善。
參考文獻(xiàn):
[1]Stora D,Agliati P,Cani M,et al.Animating Lava Flows[C].Graphics Interface,1999:203-210.
[2]Lorensen W E,Cline H E.Marching Cubes:A High Resolution 3D Surface Construction Algorithm[J].International Conference on Computer Graphics and Interactive Techniques,1987,21(4):163-169.
[3]Muller M,Schirm S,Duthaler S,et al.Screen Space Meshes[C].International Conference on Computer Graphics and Interactive Techniques,2007:9-15.
[4]Aurich V.,Weule J.(1995)Non-Linear Gaussian Filters Performing Edge Preserving Diffusion.In:Sagerer G.,Posch S.,Kummert F.(eds)Mustererkennung 1995.Informatik Aktuell.Springer,Berlin,Heidelberg.
[5]Malladi R.,Sethian J.A.(1997)Level Set Methods for Curvature Flow,Image Enchancement,and Shape Recovery in Medical Images.In:Hege HC.,Polthier K.(eds)Visualization and Mathematics.Springer,Berlin,Heidelberg.