PBR即Physically Based Rendering 基於物理的渲染技術,得益於最近幾年技能的不斷提高,不管是PC、主機還是手機、平板,都讓更為真實但更加複雜更加消耗性能的光照模型算法變為可以大量被使用的技術。現在,國外的主機和端遊大作,PBR基本已經成為常規需求,而在手機端,王者榮耀、COD手遊、楚留香等遊戲也已經大量應用PBR技術,以打造更加真實的畫面效果,高端手機運行全屏PBR已經沒什麼壓力。
首先說一下PBR的範疇(Scope of PBR),寒霜(Frostbite)引擎在SIGGRAPH 2014的分享《Moving Frostbite to PBR》中提出,基於物理的渲染的範疇,由三部分組成:
基於物理的材質(Material)
基於物理的光照(Lighting)
基於物理適配的攝像機(Camera)
三個部分都去參照物理理論去做引擎設計,理論上就能得到和真實攝像機基本相同的畫面。例如基於物理的攝像機通過調整光圈、快門速度等改變曝光度,燈光採用物理測量單位進行計量,材質使用基於物理測量值的光照模型進行計算。所有的這一切是一個系統,是相輔相成的,HDRP已經集成了這三者,本章主要討論基於物理的材質,物理光照和物理相機暫時不作過多討論。
說完PBR的範疇,我們來聊聊PBR材質,也就是我們平常聊天時說PBR的含義,PBR指一整套基於物理參數的美術流程和渲染流程。美術流程主要是貼圖製作上的,一般與PBR流程進行比較的是手繪流程。手繪流程是早期的3D美術製作流程,受限於當時機能的不足,很多硬體設備並不能承受比較多的圖片帶來的內存壓力,以及基於物理的算法、全局光照等等的GPU計算壓力,所以只使用一張diffuse漫反射貼圖來描述模型外觀,這就導致陰影和高光信息必須是畫在diffuse上的。也就是說,當場景中的光相對於模型的方向發生改變,或者攝像機位置發生改變,高光和陰影並不會發生改變,並且由於沒有高光方面的參數輸入,所以材質沒有辦法構建合理的反射,而金屬這些東西如果沒有反射,效果就會大打折扣。而為了解決表現力方面的問題,手繪流程又引入了一些技術,例如通過創建高低模然後通過烘焙輸出一張Normal法線貼圖,帶來模型結構上的凸出和凹陷的陰影,這就是美術圈所說的次時代美術流程。再比如通過增加一張Specular高光貼圖,控制高光顏色和高光強度,帶來動態的,可變顏色的高光,如果渲染方面用心一點,還可以使用一個cubemap模擬反射效果。而在Specular貼圖製作的流程上,比較違和的一點是很多Specualar貼圖都是通過xNormal或者PS這樣的工具轉換而來,然後修一修,這是完全沒有道理的一種轉換。手繪流程在15年以前的端遊以及所有的手遊上比較常見。例如魔獸世界的模型就只使用diffuse和Specular進行渲染,模型的高光位置可以改變但是陰影位置是不會變化的。
而使用Substance Painter或Quixel Suite 等軟體製作的符合PBR標準的貼圖,包含Diffuse漫反射貼圖、Normal法線貼圖、Metallic金屬度貼圖、Smoothness光滑度貼圖(即Glossiness光澤度貼圖,Roughness粗糙度貼圖的反向圖)、AO(Ambient Occlusion)環境光遮蔽貼圖等提供了大量物理信息,例如Normal提供小凹凸結構的信息,AO提供遮蔽陰影信息,Metallic提供材質在多大程度上貼近金屬的信息,Smoothness提供了材質在多大程度上是光滑的信息等等。所有這些信息使基於物理的渲染成為可能,在Shader中我們可以根據這些信息計算出實時的陰影,實時的高光,實時的反射,實時的菲涅爾效應,可以讓模型在不同的光照環境下都能得到比較合理的光照表現。此外,這種基於物理的理念也成為連接渲染和美術製作的紐帶,不會讓兩邊對最終效果產生太大的分歧。同時,這也降低了美術人員製作材質時的門檻,在手繪時代,如果想製作出效果很好的陰影、高光、材質表現是需要大量手繪練習的,相當於是在模型上作畫,現在使用PBR流程只需調整出合適的物理值,材質就自動能渲染出預想中的效果。
這個流程對美術是友好的,只需提供合理的貼圖,貼圖提供的參數合理即可,而從貼圖開始,到最終得到優秀的畫面,這個過程是需要詳細探究的,接下來我們就講講其中的理論。首先,從物理角度來講,我們先分析一下為什麼我們可以看到五顏六色的世界。光源來自太陽、火、燈具等,這些光源不斷散發的光可以認為是大量的波,這些波的波長往往是不同,而我們人類的眼睛就只能看到從400納米到700納米這一小段波長的光,我們眼睛裡有紅綠藍三種感光細胞,這些感光細胞對這一小段波長的光產生反應,發出電信號,我們的大腦再解析出這些電信號,就看到了光。而我們看到不同的物體有不同的顏色也是因為這些物體反射的此顏色對應波長的光,例如一道白光射向一個紅色表面,在抵達紅色表面之前,白光攜帶了大量不同波長的光,而當白光接觸到紅色表面,紅色表面就吸收了白光中除紅光波長的光,紅色表面反射出紅光波長的光,這部分光被人眼探測到,我們就看到了紅色的表面。
那麼,我們最核心的需要研究的就應該是光和表面到底是如何相互作用的。把光簡化為一條光束,如下圖,從微觀世界的角度,可以看到一部分光被反射出去了,即黃色部分。一部分光被折射入物體表面並和物體內部的粒子相互作用,最終重新被反射出表面,即藍色部分。我們把黃色部分稱為高光反射部分,把藍色部分稱為漫反射部分,把這兩個部分反射出去的光探究明白,理論上來講,我們就能物理正確的模擬出真實的物體表面。另外,還有一部分光轉化為熱能被物體吸收了,這個部分沒有被反射出來。
在微觀尺度上,反射是很容易被理解的,但是在之前的講解中可以很明顯看到散射出的光線可能是跟反射點在不同的地方,這就牽扯到散射尺度問題,由於我們寫Shader的主要計算是在片元著色器上,一個片元相當於代表一個像素,所以我們會以單個像素的面積來大概衡量這個散射的尺度。對於硬表面,例如塑料,如下圖的左上,它的表面的散射光反射出表面的位置和反射點相比,大約是在一個像素點之內,所以我們在寫shader的時候忽略散射和反射的距離,會把這部分光照按照漫反射處理,如下圖右上角。而對於類似皮膚這樣的表面,如下圖下半部分,它的表面的散射光反射出表面的位置和反射點大於一個像素點的範圍,此時我們不能忽略這個距離,寫shader的時候需要按照次表面散射的方式處理這部分光。
在其他教程中,對於光強的度量,也就是輻射度會有比較詳細深入的講解,因為這樣更加物理,但是這會使簡單的問題複雜化,對於項目實戰的實質幫助並不是很大。對於輻射度,也就是在Shader中關於光強的表示,我們可以簡單的理解為顏色值。
現在我們知道了光照的表示,就是一個簡單的float3,用以表示一個顏色值,如果在片元著色器的單個片元的計算時,每個片元都百分百把光照完美反射出去,那麼我們直接return這個光照float3即可。但是很明顯這樣的百分百反射跟物理世界是不同的,如果我們想要真實世界的表現效果,那麼我們必須找到每個片元的光照反射和光源的光強的關係,這個關係一般通過一個公式表示,如果囫圇吞棗一些,可以看做一個這樣的公式:「某點反射的顏色 = 牛逼的函數(光照顏色、法線方向、光照方向、固有色巴拉巴拉等等參數)」,這個牛逼的函數就被成為BRDF,英文名是Bidirectional Reflectance Distribution Function,即雙向反射分布函數。BRDF一般滿足兩個特性,交換律和能量守恆。交換律是說當攝像機位置和光源位置調換位置,這個函數計算的最終結果是相同的。能量守恆很好理解,就是這個函數的計算結果不能超過光強。關於光照計算是有很多種流派的,如果某光照計算違反了兩者或其中之一,那麼它們就不是BRDF,就不是PBR材質。PBR這個詞語語境一般就直接代表硬表面材質了,而不是基於物理這個概念,例如3S材質也是基於物理測量的,但是不叫PBR材質。
對於上一段文字描述的過程我們可以使用反射率方程進行數學上的精確描述,如下圖,括號裡的類似p、w全都是參數,可以暫時不考慮。關於這個公式裡的積分,是因為公式想使用積分的方式描述某點的所有光照的反射總和,因為這個過程往往是渲染管線層做的,所以也可以暫時不考慮,而實際上底層也只是把各個光照的結果相加而已。那麼對於我們來講,就只需要關注 、 、n、 ,是之前我們說的BRDF函數,是入射光強度,n、 一個是法線,一個是入射光強度。關於這個公式具體在Shader裡面是如果製作的,我們會在本文後段做詳盡解釋,現在我們暫時要把注意力轉移到一些其他的物理現象。
首先我們先聊一下菲涅爾效應,如果你站在湖邊,低頭看腳下的水,你會發現水是透明的,反射不是特別強烈;如果你看遠處的湖面,你會發現水並不是透明的,但反射非常強烈。這就是「菲涅爾效應」。如圖可見,視線垂直於表面時,反射較弱,而當視線非垂直表面時,夾角越小,反射越明顯。如果你看向一個圓球,那圓球中心的反射較弱,靠近邊緣較強。由於這個現象在自然界普遍存在,所以有一句話叫做「萬物皆有菲涅爾」。在文章後段,我們會對這個現象做數學表示,以使我們製作的材質有這個特性。
接下來我們討論一下F0這個變量,F0是即 0 度角入射的菲涅爾反射值。後續的數學計算將有一部分的計算是基於F0的。大多數非金屬的F0範圍是0.02~0.04,大多數金屬的F0範圍是0.7~1.0。對於硬表面PBR材質,我們一般把他們分為金屬(導體)和非金屬(絕緣體)。其中非金屬具有單色/灰色鏡面反射顏色。而金屬具有彩色的鏡面反射顏色。即非金屬的F0是一個float,而金屬的F0是一個float3。這是因為金屬對於不同波段的光波吸收程度不同,再具體到渲染中,就是在材質的高光部分上,非金屬的高光往往是白色的,金屬的高光往往是不同的顏色,例如金子的反射就是金色。F0同時也反應材質的反射能力,結合之前我們說的反射分為漫反射和高光反射以及能量守恆,故越高的F0,此材質的高光反射部分就比較多,漫反射部分就比較少,我們看到金屬的樣子實際上大部分是高光反射的樣子。材質是金屬或者非金屬由金屬度這個參數進行控制。在Shader中,F0這個參數是根據金屬度以及固有色計算而得,金屬度越高,F0與固有色顏色越接近,反之F0會與0.04趨近。換句話說,在渲染時,金屬的反光之所以帶有顏色,是因為F0約等於固有色,固有色就承擔了給高光染色的任務。
接下來,我們進入理論方面的最後一個部分,微表面理論。所有的PBR技術都基於微平面理論。這項理論認為,達到微觀尺度之後任何平面都可以用被稱為微平面(Microfacets)的細小鏡面來進行描繪。根據平面光滑程度的不同,這些細小鏡面的組成的平面會更加平坦或更加崎嶇。
在微觀尺度下,沒有任何平面是完全光滑的。然而由於這些微平面已經微小到無法逐像素的繼續對其進行區分,因此我們只有假設一個光滑度(Smoothness)參數,然後用統計學的方法來概略的估算微平面的粗糙程度。一個顯而易見的結果就是,越光滑,也就是在微觀尺度下越平坦的的平面,反射的光束越集中,因為帶來更亮更集中的高光亮點。
下面進入實戰階段,其實原理了解了,剩下的工作就只是代入公式而已。還記得之前我們說起的反射率方程嗎?仔細想想,其實反射率方程剩餘的還沒明確的部分只有 。然後基於我們對「反射由漫反射和高光反射組成」的認識,很容易得到下圖的公式。是反射BRDF, 是漫反射BRDF, 是高光反射BRDF。
對於漫反射項,我們介紹被廣為使用的Disney的研究成果,baseColor是固有色,roughness即1-smoothness,n是法線,l是光照方向,h是半角向量,即為攝像機方向和光照方向的中間向量。這個公式充分考慮了光滑度以及角度對漫反射部分的影響。
高光反射項會相對複雜一些,F項是菲涅爾項,使用的是Schlick菲涅爾近似等式,用以代表完成我們之前所說的菲涅爾現象,F0使用Metallic * Albedo+( 1 - Metallic )* [0.04, 0.04, 0.04]計算得出,相當於根據金屬度做從[0.04, 0.04, 0.04]到Albedo的插值。G項和D項分別稱為陰影遮掩函數(shadowing masking function)和法線分布函數(normal distribution funchtion),現在我們先看兩個函數需要哪些參數,然後再講原理。v是攝像機方向,k = roughness的平方除以2, =roughness的平方。
關於G項陰影遮掩函數,我們使用的是GGX光照模型的實現,其實是對小平面遮蔽小平面的數學表示,如下圖,灰色部分的光線是被遮蔽的,左圖l是光線入射方向,右圖v是攝像機方向,被遮擋的光線應該被剔除,這個剔除就可以使用G項來剔除。
關於D項法線分布函數,我們使用的也是GGX光照模型的實現,之前我們說過半角矢量,理論上來說,在微觀層面上,材質表面的小平面只有當這個小平面的發現和半角矢量相等的時候,才能產生反射,其餘小平面不產生反射,應該被剔除,這個剔除就可以使用D項來剔除。
至此,我們從反射率方程推演出了全部的PBR光照實現,而在Shader裡,也不過是一個一個的代入公式,由於公式中包含的各種與參數相關的數學特性,就使我們的最終渲染結果得到了我們理論部分說明的全部物理特性。
聲明:發布此文是出於傳遞更多知識以供交流學習之目的。若有來源標註錯誤或侵犯了您的合法權益,請作者持權屬證明與我們聯繫,我們將及時更正、刪除,謝謝。
作者:雲影
來源:https://zhuanlan.zhihu.com/p/137013668
More:【微信公眾號】 u3dnotes