?

基于GPU 的實時毛皮渲染及優化

2022-10-15 02:08方澤華溫佩賢李學闊杜曉榮
現代電子技術 2022年20期
關鍵詞:環境光法線毛皮

方澤華,楊 林,溫佩賢,李學闊,杜曉榮

(1.中山大學,廣東 珠海 519000;2.金山網絡科技有限公司,廣東 珠海 519000)

0 引 言

毛茸茸的毛皮是自然界中大部分物體的一大重要特征,其本質是由許多非常細小的毛發所組成,數量龐大,使得計算模擬變得十分困難、復雜。因此,如何高效地渲染出具有真實感的毛皮一直是許多圖形學領域不可避免的一大難題。

自2000 年來,隨著硬件高速發展,許多三維動畫制作采用幾何建模的方式來模擬頭發,使用細長的圓錐體或面片表示一根毛發,并結合高精度的光線追蹤算法來模擬每一根毛發上的光照,得到了十分逼真的毛皮效果。然而,這種方法計算量十分龐大,只能應用在離線渲染中,無法滿足實時渲染的要求。

為了解決毛皮實時渲染問題,需要簡化毛皮模型。Lengyel 提供了一種通過多層紋理渲染模擬毛皮的方法,其原理是對每根毛發分層采樣成毛發切片并記錄下來,在渲染時逐層繪制毛發切片,通過多層毛發切片的像素點疊加模擬出毛茸茸的毛皮效果。其所有運算可以在GPU 下完成,得益于GPU 強大的并行運算能力,該方法具有良好的渲染效率。但是文獻[5]方法的分層切片實現方法和光照計算模型十分落后,無法很好地模擬出真實的毛發且占用的繪制資源較多,還有很大的改進空間。Silva 等在上述切片方法的基礎上,提出了用二維貼圖記錄毛發切片信息和毛發偏移,減少了繪制資源占用并模擬出了毛發的受力效果。本文將基于多層渲染方法,結合環境光遮蔽、各向異性高光等光照算法提出新的光照模型,并加以改進優化,以達到真實性與性能的平衡。

1 多層紋理渲染

如圖1 所示,多層紋理渲染方法先是對表示毛發的圓錐體逐層采樣,并將每一層的切片范圍映射到一張二維貼圖的不透明度通道上,形成不透明度由中心向外逐漸遞減的噪點,表示一根毛發。渲染時,由里向外逐層繪制網格,每一層網格都是從模型表面沿著給定的偏移方向平移一定距離形成的,并且有給定的不透明度閾值,不透明度不在閾值范圍內的像素點會被裁剪,以此渲染出每一層對應的切片。

圖1 不透明度映射生成毛發切片

根據以上原理,生成一張充滿毛發噪點的二維貼圖,如圖2a)所示;由內到外采樣生成各層毛發切片,見圖2b);如圖2c)所示,逐層混合渲染后,即可獲得毛茸茸的毛發效果。通過調整網格或者貼圖在每一層的偏移方向,可以控制毛發的生長方向,由此可以實現圖2d)中的毛發受力效果。

圖2 分層渲染效果

2 光照模型

實現毛發渲染效果后,需要模擬真實的毛發光照。因為毛皮材質的特殊性,其光照模型比較復雜,下文將分別從毛發的漫反射光、環境光照、高光三方面闡述毛發光照模型的實現。

2.1 漫反射光

毛發漫反射采用經典的線性蘭伯特光照模型,如下:

式中:表示法線方向;表示光照方向;k表示漫反射光的顏色;為漫反射光的光照度。

蘭伯特光照模型適用于平坦均勻的表面,如圖3a)所示,其渲染效果缺乏毛皮的特征。毛皮表面充滿了細小的毛發,當光線照射到毛皮的表面時,由于毛發間相互遮擋,光線發生衰減,從而形成毛發間的陰影,這種現象稱為毛發自陰影現象,是毛發的一大重要特征。為了模擬毛發的自陰影現象,光照強度需要逐層遞減,而由于毛發之間存在縫隙,在邊沿處會有一定的透光性。

為了模擬毛發的自陰影現象和透光性,需要引入2 個變量:光照衰減系數與光照通透系數,公式如下:

層光照衰減系數由外層向內層逐層遞增,層光照通透系數由外層向內層逐層遞減,衰減速率和通透速率控制每一層的遞進速率,改進后每層切片的漫反射公式為:

如圖3b)所示,改進后的漫反射光照有了毛發間自陰影,由發尖向發根逐漸變深,突出了毛發的層次感,陰影邊沿處也有光線透過,顯得毛發更加通透,接近現實的毛發漫反射。

圖3 漫反射改進

2.2 環境光照

環境光照是指模型所在的場景中由于光的反射而出現的光照,非直射光源的光照在經典光照模型中一般是用一個光照常量或者是光照球來模擬,無環境光遮蔽的毛發圖片如圖4a)所示。但是由于物體間相互遮擋,環境光會有相應的衰減,環境光遮蔽技術就是用來模擬這種光照衰減。

圖4 環境光照改進

由于毛發縱橫交錯,目前主流毛發環境光遮蔽采用體素取樣的方法,通過體素劃分將毛發劃分成一塊塊小區域,并取樣計算出該區域的毛發密度及深度,繼而算出該區域的遮蔽因子,從而實現環境光遮蔽。

對于多層紋理毛發渲染模型,可以用層數代替深度值簡化毛發切片上的環境光遮蔽因子采樣計算過程,簡化后每層毛發切片環境光公式如下:

式中:k為環境光顏色;為環境光的光照強度;為每一層遮蔽因子的遞進速率,通過插值計算可以使每一層的顏色過渡變得更加平滑。圖4b)中,加入環境光遮蔽后,毛發有了層次感。

由于毛發具有通透性,且發尖部分密度低、透光性更強,在輪廓邊沿處需要補充一定的光照,因此加入Schlick 菲涅爾近似等式計算補充的輪廓光,并結合環境光遮蔽,公式如下:

如圖4c)所示,結合環境光遮蔽和輪廓光后的環境光照下,毛發顯得通透且富有層次感,接近與真實的毛發效果。

2.3 高 光

由于微觀角度下毛發可以簡化成一根直徑很小的圓柱,毛發每一片切片上的高光可以視作切片上各個點的高光積分,而每一個點的法線方向都不一樣,因此形成了毛發獨特的高光,這樣的毛發高光也就被稱為各向異性高光。

針對毛發的各向異性高光,Kajiya 等基于Blinn-Phong 光照模型,提出通過向毛發切片橫截面的切線方向偏移法線獲取其中當前點的高光權重最大的法線,計算當前點的高光的毛發光照模型。由于橫截面上有各個方向的法線,難以定位高光權重最大的法線,而毛發切片橫截面的垂向方向切線垂直于橫截面上的任意法線,Kajiya 以此提出使用切線與中間向量的正弦值替代計算法線與中間向量的余弦值,公式如下:

然而毛發纖維并不是單純的光滑圓柱體,顯微鏡下毛發纖維表面上有著粗糙的鱗片相互層疊,鱗片結構之下是毛髓質,光線會在毛髓質內折射后再次出射,還會多次反射后再次出射,存在多條傳播路徑,形成毛發復雜的光照。為了模擬光線進入毛髓質之后經過折射再次出射這條光路,需要在原來高光的基礎上再加一層明度偏低飽和度偏高的高光。相比于圖5a)的單層高光,圖5b)中改進之后的毛發高光更顯真實。

圖5 毛發高光改進

2.4 Gamma 校正

Gamma 校正原理如圖6 所示。將上述光照模型的計算結果整合到一起后,得出如圖7a)所示效果,但是在線性色彩空間下毛球的暗部過于偏暗,這是由于人對自然光照下灰階的主觀感知并不是呈線性關系,而是圖6 中的冪函數關系,因此對于線性輸出的色彩會產生暗部過渡偏暗和亮部過渡偏亮的感知。為了能看到正確的均勻灰階,需要在輸出時進行Gamma 校正,將色彩從線性空間轉換到Gamma 空間中。

圖6 Gamma 校正原理

Gamma 校正公式如下:

經過Gamma 校正后,最終效果如圖7b)所示。

圖7 校正前后效果對比

3 算法框架

基于第1.2 節的闡述,本文提出的實時毛皮渲染算法框架如下:

ALGORITHM 1:Real-time Fur Rendering and Lighting

Input:vertex,normal,force that effect on fur,lights that effect on fur

Output:the lighting result for each layer()

1. for= 0 to layerCount do

2. depth ←calculate the layer depth for layer

3. alpha ←CalcCurrentPixelAlpha(depth)

4. V←+ FurGrowDirection(depth,,)

5. //Calculate Lighting:

6. for every light L∈do

7. //Calculate Diffuse Lighting:

8.←calculate the fill-in light in layer

9.←calculate the light attenuation in layer

10.()←Saturate(·L+-)

11. //Calculate Ambient Lighting:

12.←CalcOcclusionFactor(depth)

13. l←Lerp(0,CalcAmbientAttenuation(depth),)

14.← Max(0,Min(1,rimBias+rimScale*((1-(·))*)))

15.()←l+

16. //Calculate Specular Lighting:

17.←Normalize(+)

18.←(1-Normalize(+primaryShift*)·)

19.←(1-Normalize(+secondaryShift*)·)

20.()←+

21.()←()+()+()+()

22. end for

23.()←LinearToGammaSpace(())

24. end for

4 優 化

毛發切片之間存在縫隙,需要通過大量層數疊加才能模擬出精細的頭發效果,但是這也就導致了毛發切片所在的像素會被多次重復繪制,占用大量GPU 資源,從而在移動端等GPU 資源匱乏的硬件上造成性能瓶頸。為了解決重復繪制過多問題,需要減少繪制毛發切片的層數。原本的多層渲染中,毛發是被視作圓錐體進行切片,透明度閾值與切片層數呈線性關系,這也導致了中層到外層的切片透明度偏低,從而在切片層數少的情況下會出現失真,如圖8a),b)所示。

圖8 優化效果

因此需要調整切片的透明度閾值衰減曲線,采用二次曲線關系以減緩透明度閾值的衰減速度。如圖9 所示,改進后衰減曲線在中上層的衰減速度明顯減緩。調整衰減曲線后,中層毛發切片的透明度明顯提高,如圖8c)所示,優化后能以1/ 3 的層數取得不錯的毛發效果,重復繪制導致的渲染壓力也明顯減少。

圖9 衰減曲線改進

5 結 語

基于多層紋理渲染方法,結合多個光照模型,本文闡述了一種高效的毛皮渲染方法,能夠很好地模擬短小毛發的光照,提高毛皮的真實感效果。同時提出了優化透明度閾值衰減曲線的方案,減少了模擬毛發所需的繪制層數,使得這種技術可適用于移動端等GPU 資源匱乏的平臺中。本文研究對于毛皮材質在游戲、動畫、虛擬現實等領域的應用有重要的價值。

猜你喜歡
環境光法線毛皮
基于定位法線的工件自由度判定方法及應用
單幀圖像下的環境光遮蔽估計
橢圓法線定理的逆定理
基于LCD顯示器光譜特性的圖像顏色一致性研究
近期國內毛皮市場最新行情
近期國內毛皮市場最新行情
雙曲螺線的副法線曲面的相關性質研究*
美信推出集成七個傳感器的IC,可檢測RGB、紅外線等
智能屏變:筆記本環境感光技術
三談等軸雙曲線的典型性質
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合