您當前的位置:首頁 > 書法

Unity素描渲染畢業設計的 總結筆記(I)

作者:由 蔣融 發表于 書法時間:2019-06-05

基於法線和深度值的屏幕後處理風格化描邊演算法

“即便是煙霧,也必須用線條來表現。” 讓·奧古斯特·多米尼克·安格爾,新古典主義畫派大師如是說。線條對於體現物體表面的張力與形態,在傳統繪畫中佔有無與倫比的地位。而素描作為藝術的標尺和創造輪廓的途徑,自然與線條緊密地結合在一起。因此,好的描邊演算法對於模擬素描風格的渲染技術而言,其重要性自然不言而喻。本章中,作者闡述了自己在專案中對素描風格描邊演算法的一些調查與研究。

基本原理

總的來說,該演算法利用了實時渲染每幀產生的深度和視角空間法線紋理中的不連續性,使用傳統的邊緣探測演算法來提取出邊緣作為描邊結果。

Saito與Takahashi

[1]

建議對z-buffer使用Sobel運算元進行邊緣探測,因為物體的輪廓往往與深度緩衝中0階不連續(C0)的畫素相重合,因此基於深度緩衝的邊緣探測可以有效地得到物體內外部的大致輪廓。而Hertzmann

[2]

在該方法的基礎上增加了對法線緩衝的邊緣探測,法線緩衝能夠探測1階不連續的邊緣,即那些z值變化不大,但表面方向發生比較劇烈變化的地方。兩種方法結合起來,可得到較理想的結果。

演算法的優缺點分析

基於深度與法線的螢幕空間邊緣探測演算法,也是目前在實時渲染方面應用較多的一種演算法,作者認為其主要優點包括以下幾方面:

魯棒性強:螢幕空間探測演算法不需要對渲染過程做太多修改,可以作為屏幕後處理外掛來整合到渲染器或遊戲引擎內;例如,目前無論實時還是離線的CG製作流程中,都會為增加模型視覺細節而搭配法線貼圖,偏移貼圖,細節凹凸貼圖等貼圖,而這些細節的描邊顯然是透過直接處理幾何資訊所無法得到的。而屏幕後處理演算法處理的是最終的渲染結果,因此可以探測到這些邊緣。

靈活簡便:能很好地與當前主流的遊戲引擎相耦合,以Unity引擎為例,無論是前向渲染路徑(Forward Rendering)還是延遲渲染路徑(Deferred Rendering),都可以在渲染時自動生成含有深度與世界法線資訊的紋理。

效能理想:因為只涉及屏幕後處理中進行卷積計算,並且計算量與場景中模型個數無關,因此與涉及幾何資訊處理(Geometry Shader)的演算法相比,效能消耗總體較低且能保持穩定。這一點在實際應用中可以得到證明,例如最有名的帶有實時描邊效果的一款遊戲《無主之地》,整個遊戲中都使用的是該描邊方法,並達到了理想的渲染幀率和畫面表現力。

螢幕空間演算法儘管有上述的種種優點,但也有一些缺點:

對於邊緣線的各種屬性,使用者很難進行有效的控制,例如,邊緣的粗細程度,各種不同性質邊的分類(內輪廓,外輪廓,自相交的邊,物體的邊界)等等。

進一步的風格化存在難度。因為由螢幕空間演算法探測到的邊緣資訊只體現為一張單純的邊緣強度紋理,並沒有附帶任何數學上的分析性質。因此要想使用傳統的筆刷模擬演算法來在這些線上實現風格化的筆刷效果,是幾乎不可能做到的。

演算法的擴充套件和改進

我們將從三個方面來改進演算法。首先是對描邊結果進行抗鋸齒處理;其次對描邊結果進行仿抖動處理;最後,增加鉛筆筆觸和紋理效果。

描邊的抗鋸齒處理.

描邊的結果往往會有一些鋸齒,這對於達到理想的視覺效果是不利的。另一方面,平滑的描邊結果對後面的擾動效果也是十分重要的:如果描邊結果鋸齒過多,那麼擾動過後會有許多礙眼的噪點。因此該專案使用了FXAA抗鋸齒演算法來得到平滑的描邊結果。

Unity素描渲染畢業設計的 總結筆記(I)

圖2-1 左圖為未處理過的描邊結果,右圖為進行FXAA後的結果。

模擬手繪描邊的抖動效果.

雖然在該演算法中,由於沒有對描邊曲線進行引數化,因此很難使用傳統的筆刷模擬演算法來實現描邊的風格化;但還是有一些比較特殊的手段。如Nienhaus等

[3]

提出的演算法,利用3D噪聲對描邊結果進行擾動,以模擬手繪過程中由於人手有意或無意的抖動而導致的與實際的邊緣不一致的彎曲線條。其基本原理是將3D噪聲投射到網格模型表面上,作為模型的紋理渲染出一張貼圖;隨後將描邊結果根據該帖圖中相應位置的噪聲值進行擾動處理。在本專案的實現中,我們對其演算法進行了改進和擴充套件。

原文為了避免“Shadow door”效果,需使3D噪聲的擾動效果與物體幾何性質繫結在一起,因此將網格模型頂點沿著法線膨脹,然後把3D噪聲投射到膨脹的模型上得到一張渲染紋理,最後根據該紋理對描邊結果進行擾動;在實際應用中,這種膨脹處理對於光滑的模型比較適用,但是對於硬表面模型則不然。對於有著多個頂點法向量的頂點,可能在膨脹的過程中分離為多個頂點,從而撕裂網格模型。改進為根據模型的包圍盒中心對模型進行放大操作後就可以解決該問題。設最終輸出到螢幕上的值為 ,頂點的模型空間座標為 , 頂點在螢幕上所在的畫素座標為 , 頂點所屬物體的包圍盒中心表示為 , 3D噪聲可以表示為一個對映函式Noise(x, y, z)。

Unity素描渲染畢業設計的 總結筆記(I)

圖2-2 3D噪聲投射到場景網格模型後所得的結果

單獨使用噪聲來進行擾動並不能得到很理想的結果,原因有二:其一,畫家在繪製素描線稿時,不僅是每條線會發生抖動,而且由於手繪的線條總會有好幾條與其近乎平行的線條來起到補充調整的效果,而且由於人手運動時的慣性,有些線條會被繪製得過長,從而超出原來應有的長度。基於以上的觀察,作者提出了一種改進方案:

根據頂點的切線在螢幕空間(即NDC空間)上的投影的xy分量單位化後的向量來做擾動(如果希望取得更好的結果,可以嘗試更多的方向),可得到與原線條線平行的4條線,再對這些線與原線條一起根據噪聲進行擾動,如圖2-3所示。

Unity素描渲染畢業設計的 總結筆記(I)

圖 2-3 左圖為切線在螢幕空間的xy分量,右圖的小箭頭顯示了左圖各處對應的擾動方向。

Unity素描渲染畢業設計的 總結筆記(I)

圖2-4擾動後的結果

作者也嘗試過使用頂點法線而非切線來驅動描邊的擾動,但經過比較,至少在本測試場景中,使用切線是更好的選擇。值得注意的是,由於切線方向與UV貼圖的分割擺放方式有關,因此最好能將各個物件模型的UV貼圖按照橫平豎直的方式擺放。

模擬鉛筆筆觸和紋理.

儘管前面的步驟得到了比較好的線條抖動效果,但是由於是由邊緣探測得到的線條都是連續的一些黑線,沒有鉛筆的紋理,因此作者使用了一種特殊的影象處理演算法:Slope Blur演算法,該演算法為一個迴圈的過程,每次迭代時,都將影象依據一張輸入的貼圖進行與當前迭代次數成反比強度的擾動,並與上次迭代所得的結果影象按照設定的模式混合,本專案中使用的是正片疊底混合模式。

Unity素描渲染畢業設計的 總結筆記(I)

圖 2-5 處理後的結果(迴圈次數為5)

本章小結

總的來說,透過以上描述的風格化描邊演算法,我們較好地模擬了素描的描邊效果。但是仍然有以下幾點有待改進:

描邊粗細程度應當可以變化和控制,並且有些邊應當具有逐漸淡去的效果。

可以嘗試Object Space的演算法對描邊結果進行引數化。

鉛筆筆觸凹凸不平的法線紋理應當也得到合適的模擬。

標簽: 描邊  演算法  擾動  螢幕  結果