1. 程式人生 > >【《Real-Time Rendering 3rd》 提煉總結】(四) 第五章 · 圖形渲染與視覺外觀 The Visual Appearance

【《Real-Time Rendering 3rd》 提煉總結】(四) 第五章 · 圖形渲染與視覺外觀 The Visual Appearance



這篇文章將總結和提煉《Real-Time Rendering 3rd》(實時渲染圖形學第三版)的第五章“Visual Appearance(視覺外觀)”的內容。





壹·導讀


當我們渲染三維模型的影象時,模型不僅要有適當的幾何形狀,還應該有所需的視覺外觀。《Real-Time Rendering 3rd》第五章內容,討論光照和材質在現實世界的表現,關於光照和表面模型,著色方程,以及渲染出真實外觀的一些額外技術。

簡而言之,通過閱讀這篇總結式文章,你將對圖形渲染中的以下要點有所瞭解:

    • 渲染與視覺物理現象
    • 光照與材質
    • 著色原理
    • 抗鋸齒
    • 透明渲染
    • 伽瑪校正

當然,本文作為總結式文章,知識點會相對密集,很多地方對細節並不可能展開描述,對一些地方不太理解的朋友,自然還是推薦是去閱讀《Real-Time Rendering 3rd》的對應原文與相應文獻。


貳·渲染與視覺物理現象


當渲染類似圖1中的逼真場景時,可以幫助瞭解渲染相關的物理現象。一般情況,這些物理現象分為三種:

    • 太陽光與其他光源(天然或人造光)發出光。
    • 光與場景中的物體相互作用。部分被吸收;部分散射開來,向新的方向傳播。
    • 最終,光被感測器(人眼,電子感測器)吸收。


圖1 光源與各種物體互動的臥室照片

而在圖1中,我們可以看到所有的如上三種物理現象:

    • 光線從燈光發出並直接傳播給房間裡其他物體。
    • 物體表面吸收一些物體,並將一些物體散射到新的方向。沒有被吸收的光線繼續在環境中移動,遇到其他物體。
    • 通過場景的光一小部分光進入用於捕獲影象的感測器(如攝像機)。

叄·光照與材質


    • 關於光源的特性。光被不同地模擬為幾何光線,電磁波或光子(具有一些波特性的量子粒子)。無論如何處理,光都是電磁輻射能-通過空間傳播的電磁能。光源發光,而不是散射或吸收光。根據渲染目的,光源可以以許多不同的方式來表示。光源可以分為三種不同型別:平行光源、點光源和聚光燈。
    • 關於材質的特性。在渲染中,通過將材質附加到場景中的模型來描繪物件外觀。每個材質都和一系列的Shader程式碼,紋理,和其他屬性聯絡在一起,用來模擬光與材質相互作用。

3.1 光照現象:散射與吸收


    • 從根本上來說,所有的光物質相互作用都是兩種現象的結果: 散射(scattering)和吸收(absorption)。
    • 散射(scattering)發生在當光線遇到任何種類的光學不連續性(optical discontinuity)時,可能存在於具有不同光學性質的兩種物質分界之處,晶體結構破裂處,密度的變化處等。散射不會改變光量,它只是使其改變方向。光的散射(scattering)一般又分為反射(reflection)和折射(refraction)。


圖2 光的散射(scattering)——反射(reflection)和折射(refraction)

    • 吸收(absorption)發生在物質內部,其會導致一些光轉變成另一種能量並消失。 吸收會減少光量,但不會影響其方向。

圖3 反射(reflected light)和透射光(transmitted light)的相互作用

    • 鏡面反射光表示在表面反射的光。而漫反射光表示經歷透射(transmission),吸收(absorption)和散射(scattering) 的光。
    • 入射光(Incoming illumination)通過表面輝度(irradiance)來度量。而出射光(outgoing light)通過出射率(exitance)來度量,類似於輝度是每單位面積的能量。光物質相互作用是線性的; 使輝度加倍將會使出射率增加一倍。出射率除以輝度可以作為材質的衡量特性。對於不發光的表面,該比率為0到1之間。出射率和輝度的比率對於不同的光顏色是不同的,所以其表示為RGB向量或者顏色,也就是我們通常說的表面顏色c。

3.2 表面粗糙度

    • 鏡面反射項的方向分佈取決於表面粗糙度(roughness,其反義詞是smoothness,光滑度)。反射光線對於更平滑的表面更加緊密,並且對於較粗糙的表面更加分散。我們可以看到下圖中的這種依賴關係,它顯示了不同粗糙度的兩個表面的反射效果。

圖4 光在粗糙度不同表面的反射




肆·著色



4.1 著色與著色方程


著色(Shade)是使用方程式根據材質屬性和光源,計算沿著視線v的出射光亮度Lo的過程。我們使用的著色方程具有漫反射和鏡面反射分量。


4.1.1 著色方程的漫反射分量

其中漫反射分量較為簡單,書中推匯出的對Ldiff的著色方程如下:

這種型別的漫反射著色也被叫做蘭伯特(Lambertian)著色。蘭伯特定律指出,對於理想的漫反射表面,出射光亮度與cosθi成正比。注意,這種夾緊型cos因子(clamped dot product,可寫作max(n·l, 0),通常稱為n點乘l因子),不是蘭伯特表面的特徵;正如我們所見,它一般適用於輝度(irradiance)的度量。蘭伯特表面的決定性特徵是出射光亮度(radiance)和輝度(irradiance)成正比。

4.1.2 著色方程的鏡面反射分量

原書中推匯出的鏡面反射項的著色方程:

4.1.3 著色方程

組合漫反射和鏡面反射兩個項,得到完整的著色方程,總出射光亮度Lo:

這個著色方程與“Blinn-Phong”方程類似,“Blinn-Phong”方程是Blinn在1977年首次提出的。主要形式如下:

4.2 三種著色處理方法

著色處理是計算光照並由此決定畫素顏色的過程,存在3種常見的著色處理方法:平滑著色、高洛德著色與馮氏著色。

    • 平滑著色(Flat shading):簡單來講,就是一個三角面用同一個顏色。如果一個三角面的代表頂點(也許是按在index中的第一個頂點),恰好被光照成了白色,那麼整個面都會是白的。
    • 高洛德著色(Gouraud shading):每頂點求值後的線性插值結果通常稱為高洛德著色。在高洛德著色的實現中,頂點著色器傳遞世界空間的頂點法線和位置到Shade( ) 函式(首先確保法線向量長度為1),然後將結果寫入內插值。畫素著色器將獲取內插值並將其直接寫入輸出。 高洛德著色可以為無光澤表面產生合理的結果,但是對於強高光反射的表面,可能會失真(artifacts)。
    • 馮氏著色(Phong shading):馮氏著色是對著色方程進行完全的畫素求值。在馮氏著色實現中,頂點著色器將世界空間法線和位置寫入內插值,此值通過畫素著色器傳遞給Shade( )函式。而將Shade( )函式返回值寫入到輸出中。請注意,即使表面法線在頂點著色器中縮放為長度1,插值也可以改變其長度,因此可能需要在畫素著色器中再次執行此歸一化操作。

圖5 從左到右,平面著色(Flat shading),高洛德著色( Gouraud shading), 和馮氏著色(Phong shading)

    • 注意Phong Shading和Phong Lighting Model的區別,前者是考慮如何在三個頂點中填充顏色,而後者表示的是物體被光照產生的效果。
    • 注意馮氏著色可以說是三者中最接近真實的著色效果,當然開銷也是最大的。因為高洛德著色是每個頂點(vertex)計算一次光照,馮氏著色是每個片元(fragment)或者說每畫素計算一次光照,點的法向量是通過頂點的法向量插值得到的。所以說不會出現高洛德著色也許會遇到的失真問題。


伍·抗鋸齒與常見抗鋸齒型別總結


抗鋸齒(英語:anti-aliasing,簡稱AA),也譯為邊緣柔化、消除混疊、抗影象摺疊有損,反走樣等。它是一種消除顯示器輸出的畫面中圖物邊緣出現凹凸鋸齒的技術,那些凹凸的鋸齒通常因為高解析度的訊號以低解析度表示或無法準確運算出3D圖形座標定位時所導致的圖形混疊(aliasing)而產生的,抗鋸齒技術能有效地解決這些問題。

下面將常見的幾種抗鋸齒型別進行總結介紹,也包括RTR3中沒有講到的,最近幾年新提出的常見抗鋸齒型別。


5.1 超級取樣抗鋸齒(SSAA)

超級取樣抗鋸齒(Super-Sampling Anti-Aliasing,簡稱SSAA)是比較早期的抗鋸齒方法,比較消耗資源,但簡單直接。這種抗鋸齒方法先把影象對映到快取並把它放大,再用超級取樣把放大後的影象畫素進行取樣,一般選取2個或4個鄰近畫素,把這些取樣混合起來後,生成的最終畫素,令每個畫素擁有鄰近畫素的特徵,畫素與畫素之間的過渡色彩,就變得近似,令圖形的邊緣色彩過渡趨於平滑。再把最終畫素還原回原來大小的影象,並儲存到幀快取也就是視訊記憶體中,替代原影象儲存起來,最後輸出到顯示器,顯示出一幀畫面。這樣就等於把一幅模糊的大圖,通過細膩化後再縮小成清晰的小圖。如果每幀都進行抗鋸齒處理,遊戲或視訊中的所有畫面都帶有抗鋸齒效果。 超級取樣抗鋸齒中使用的取樣法一般有兩種:

    • OGSS,順序柵格超級取樣(Ordered Grid Super-Sampling,簡稱OGSS),取樣時選取2個鄰近畫素。
    • RGSS,旋轉柵格超級取樣(Rotated Grid Super-Sampling,簡稱RGSS),取樣時選取4個鄰近畫素。

另外,作為概念上最簡單的一種超取樣方法,全場景抗鋸齒(Full-Scene Antialiasing,FSAA)以較高的解析度對場景進行繪製,然後對相鄰的取樣樣本進行平均,從而生成一幅新的影象。


5.2 多重取樣抗鋸齒(MSAA)

多重取樣抗鋸齒(Multi Sampling Anti-Aliasing,簡稱MSAA),是一種特殊的超級取樣抗鋸齒(SSAA)。MSAA首先來自於OpenGL。具體是MSAA只對Z快取(Z-Buffer)和模板快取(Stencil Buffer)中的資料進行超級取樣抗鋸齒的處理。可以簡單理解為只對多邊形的邊緣進行抗鋸齒處理。這樣的話,相比SSAA對畫面中所有資料進行處理,MSAA對資源的消耗需求大大減弱,不過在畫質上可能稍有不如SSAA。


5.3 覆蓋取樣抗鋸齒(CSAA)

覆蓋取樣抗鋸齒(Coverage Sampling Anti-Aliasing,簡稱CSAA)是NVIDIA在G80及其衍生產品首次推向實用化的AA技術,也是目前NVIDIA GeForce 8/9/G200系列獨享的AA技術。CSAA就是在MSAA基礎上更進一步的節省視訊記憶體使用量及頻寬,簡單說CSAA就是將邊緣多邊形裡需要取樣的子畫素座標覆蓋掉,把原畫素座標強制安置在硬體和驅動程式預先算好的座標中。這就好比取樣標準統一的MSAA,能夠最高效率的執行邊緣取樣,效能提升非常的顯著。比方說16xCSAA取樣效能下降幅度僅比4xMSAA略高一點,處理效果卻幾乎和8xMSAA一樣。8xCSAA有著4xMSAA的處理效果,效能消耗卻和2xMSAA相同。


5.4 高解析度抗鋸齒(HRAA)

高解析度抗鋸齒方法(High Resolution Anti-Aliasing,簡稱HRAA),也稱Quincunx方法,也出自NVIDIA公司。“Quincunx”意思是5個物體的排列方式,其中4個在正方形角上,第五個在正方形中心,也就是梅花形,很像六邊模型上的五點圖案模式。此方法中,取樣模式是五點梅花狀,其中四個樣本在畫素單元的角上,最後一個在中心。


5.5 可程式設計過濾抗鋸齒(CFAA)

可程式設計過濾抗鋸齒(Custom Filter Anti-Aliasing,簡稱CFAA)技術起源於AMD-ATI的R600家庭。簡單地說CFAA就是擴大取樣面積的MSAA,比方說之前的MSAA是嚴格選取物體邊緣畫素進行縮放的,而CFAA則可以通過驅動和諧靈活地選擇對影響鋸齒效果較大的畫素進行縮放,以較少的效能犧牲換取平滑效果。顯示卡資源佔用也比較小。


5.6 形態抗鋸齒(MLAA)

形態抗鋸齒(Morphological Anti-Aliasing,簡稱MLAA),是AMD推出的完全基於CPU處理的抗鋸齒解決方案。與MSAA不同, MLAA將跨越邊緣畫素的前景和背景色進行混合,用第2種顏色來填充該畫素,從而更有效地改進影象邊緣的變現效果。


5.7 快速近似抗鋸齒(FXAA)

快速近似抗鋸齒(Fast Approximate Anti-Aliasing,簡稱FXAA) ,是傳統MSAA(多重取樣抗鋸齒)效果的一種高效能近似。它是一種單程畫素著色器,和MLAA一樣運行於目標遊戲渲染管線的後期處理階段,但不像後者那樣使用DirectCompute,而只是單純的後期處理著色器,不依賴於任何GPU計算API。正因為如此,FXAA技術對顯示卡沒有特殊要求,完全相容NVIDIA、AMD的不同顯示卡(MLAA僅支援A卡)和DirectX 9.0、DirectX 10、DirectX 11。


5.8 時間性抗鋸齒(TXAA)

時間性抗鋸齒(Temporal Anti-Aliasing,簡稱TXAA),將 MSAA、時間濾波以及後期處理相結合,用於呈現更高的視覺保真度。與CG電影中所採用的技術類似,TXAA集MSAA的強大功能與複雜的解析濾鏡於一身,可呈現出更加平滑的影象效果。此外,TXAA還能夠對幀之間的整個場景進行抖動取樣,以減少閃爍情形,閃爍情形在技術上又稱作時間性鋸齒。目前,TXAA有兩種模式:TXAA 2X和TXAA 4X。TXAA 2X可提供堪比8X MSAA的視覺保真度,然而所需效能卻與2X MSAA相類似;TXAA 4X的影象保真度勝過8XMSAA,所需效能僅僅與4X MSAA相當。


5.9 多幀取樣抗鋸齒(MFAA)

多幀取樣抗鋸齒(Multi-Frame Sampled Anti-Aliasing,MFAA)是 NVIDIA公司根據MSAA改進出的一種抗鋸齒技術。目前僅搭載 Maxwell 架構GPU的顯示卡才能使用。可以將MFAA理解為MSAA的優化版,能夠在得到幾乎相同效果的同時提升效能上的表現。MFAA與MSAA最大的差別就在於在同樣開啟4倍效果的時候MSAA是真正的針對每個邊緣畫素周圍的4個畫素進行取樣,MFAA則是僅僅只是採用交錯的方式取樣邊緣某個畫素周圍的兩個畫素。


陸·透明渲染與透明排序




6.1 透明渲染

透明渲染是是圖形學裡面的常見問題之一,可以從《Real-Time Rendering 3rd》中總結出如下兩個演算法:

    • Screen-Door Transparency方法。基本思想是用棋盤格填充模式來繪製透明多邊形,也就是說,以每隔一個畫素繪製一點方式的來繪製一個多邊形,這樣會使在其後面的物體部分可見,通常情況下,螢幕上的畫素比較緊湊,以至於棋盤格的這種繪製方式並不會露餡。同樣的想法也用於剪下紋理的抗鋸齒邊緣,但是在子畫素級別中的,這是一種稱為alpha覆蓋(alpha to coverage)的特徵。screen-door transparency方法的優點就是簡單,可以在任何時間任何順序繪製透明物體,並不需要特殊的硬體支援(只要支援填充模式)。缺點是透明度效果僅在50%時最好,且螢幕的每個區域中只能繪製一個透明物體。
    • Alpha混合(Alpha Blending)方法。這個方法比較常見,其實就是按照Alpha混合向量的值來混合源畫素和目標畫素。當在螢幕上繪製某個物體時,與每個畫素相關聯的值有RGB顏色和Z緩衝深度值,以及另外一個成分alpha分量,這個alpha值也可以根據需要生成並存儲,它描述的是給定畫素的物件片段的不透明度的值。 alpha為1.0表示物件不透明,完全覆蓋畫素所在區域; 0.0表示畫素完全透明。為了使物件透明,在現有場景的上方,以小於1的透明度進行繪製即可。每個畫素將從渲染管線接收到一個RGBA結果,並將這個值和原始畫素顏色相混合。


6.2 透明排序

要將透明物件正確地渲染到場景中,通常需要對物體進行排序。下面分別介紹兩種比較基本的透明排序方法(深度快取和油畫家演算法)和兩種高級別的透明排序演算法(加權平均值演算法和深度剝離)。


6.2.1 深度快取(Z-Buffer)

Z-Buffer也稱深度緩衝。在計算機圖形學中,深度緩衝是在三維圖形中處理影象深度座標的過程,這個過程通常在硬體中完成,它也可以在軟體中完成,它是可見性問題的一個解決方法。可見性問題是確定渲染場景中哪部分可見、哪部分不可見的問題。

Z-buffer的限制是每畫素只儲存一個物件。如果一些透明物件與同一個畫素重疊,那麼單獨的Z-buffer就不能儲存並且稍後再解析出所有可見物件的效果。這個問題是通過改變加速器架構來解決的,比如用A-buffer。A-buffer具有“深度畫素(deep pixels)”,其可以在單個畫素中儲存一系列呈現在所有物件之後被解析為單個畫素顏色的多個片段。但需注意,Z-buffer是市場的主流選擇。

6.2.2 畫家演算法(Painter's Algorithm)

畫家演算法也稱優先填充演算法,效率雖然較低,但還是可以有效處理透明排序的問題。其基本思想是按照畫家在繪製一幅畫作時,首先繪製距離較遠的場景,然後用繪製距離較近的場景覆蓋較遠的部分的思想。畫家演算法首先將場景中的多邊形根據深度進行排序,然後按照順序進行描繪。這種方法通常會將不可見的部分覆蓋,這樣就可以解決可見性問題。


6.2.3 加權平均值演算法(Weighted Average)

使用簡單的透明混合公式來實現無序透明渲染的演算法,它通過擴充套件透明混合公式,來實現無序透明物件的渲染,從而得到一定程度上逼真的結果。


6.2.4 深度剝離演算法(Depth Peeling)

深度剝離是一種對深度值進行排序的技術。它的原理比較直觀,標準的深度檢測使場景中的Z值最小的點輸出到螢幕上,就是離我們最近的頂點。但還有離我們第二近的頂點,第三近的頂點存在。要想顯示它們,可以用多遍渲染的方法。第一遍渲染時,按照正常方式處理,這樣就得到了離我們最近的表面中的每個頂點的z值。在第二遍渲染時,把現在每個頂點的深度值和剛才的那個深度值進行比較,凡是小於等於第一遍得到的z值,把它們剝離,後面的過程依次類推即可。

圖6 每個深度剝離通道渲染特定的一層透明通道。左側是第一個Pass,直接顯示眼睛可見的層,中間的圖顯示了第二層,顯示了每個畫素處第二靠近透明表面的畫素。右邊的圖是第三層,每個畫素處第三靠近透明表面的畫素。