PBR渲染介紹

PBR全稱(Physicallly-Based?Rendering)。籠統的說,就字面含義可以看出,這是一種基于物理規律模擬的一種渲染技術。最早用于電影的照片級真實的渲染。近幾年由于硬件性能的不斷提高,已經大量運用于PC游戲與主機游戲的實時渲染。幾款著名的3D引擎均有了各自的實現(UnrealEngine?4,?CryEngine?3,?Unity?3D?5)。此外目前國外的一款HTML5?3D引擎(PlayCanvas)?也已使用了PBR,并且在iPhone5s的手機瀏覽器中可以流暢播放。

本文雖然是介紹渲染技術的,但不是工程師向的,所以不會涉及到任何的高等數學公式與程序代碼

PBR的應用

如下是幾個實際應用案例,PBR可以達到什么樣的效果:

HTML5引擎Demo

使用PBR的游戲截圖

使用PBR的動畫電影

使用PBR的真人電影

基于PBR的電影級渲染器Arnold

Arnold渲染器是一款高級的、跨平臺的渲染API,是基于物理算法的電影級別渲染引擎。近期使用了Arnold的一些電影有:地心引力,饑餓游戲(系列),復仇者聯盟(系列),精靈旅社(系列),碟中諜4,X戰警(系列),源代碼。

PBR的組成

漫反射與反射

漫反射與反射是光線在物體表面作用的最基本的兩個表現。傳統游戲的渲染系統中也把它們叫做漫反射與高光。

當光線達到物體表面的時候其中的一部分將會沿著表面的垂直法線反彈向與來源光線相反的方向。這就像皮球沿一定角度砸向地面后反彈一樣。在越光滑的表面就表現的越像鏡面反射,這種現象一般本稱作表面高光(Specular)。這個詞就是來源于拉丁文的“鏡子”的發音。

然而并不是所有的光線都會被反射,部分光線將進入被照射物體的內部。這部分光線一部分被物體吸收轉換為熱能,另一部分則會在物體內部發生散射,最終離開物體被人眼和攝像機捕獲到。這一現象被叫做“漫反射”與“子表面散射”。其中子表面散射(Sub?Surface?Scattering),經常能看到SSS效果就是這部分光線進過散射后從物體另一邊射出的現象。

不同波長的光線的吸收與散射有著很大的不同,這就是為什么白光在不同物體的表面能照射出不同的顏色。比如:某種材料會散射大部分的藍光,并吸收其它顏色的光,那么這種材料的表面就會表現出藍色。散射出去的光線是雜亂的,射向各個方向的,所以不會表現出鏡面反射的效果。游戲引擎中一般使用漫反射貼圖(“Diffuse?Map”也叫“Albedo?Map”)來描述物體表面的顏色。

能量守恒

由上面的描述我們可以看出,漫反射與反射是相互獨立的兩部分。入射光線的一部分在物體表面發生了反射,沒有反射的一部分進入物體表面被吸收或者被散射。因此可以得出一個重要的結論:漫反射光線+反射光線=入射光線。這就是光線的能量守恒。

這一現象就表現在,同樣的光照條件下,反射越強烈的材質表面漫反射就越弱(表現為更暗)。如下圖可以看出,從左到右材質的反射逐漸加強,同時材質本身的顏色越來越不明顯。

能量守恒是PBR最重要的一個守則,遵循此守則可以確保美術在調整物體材質的漫反射和反射時不至于調出一些打破物理規律,在不同環境中表現極不真實的材質。

金屬

這里把金屬(導電性材質)單獨拿出來說有以下幾點原因。

首先,導體的反射度通常都達到60%-90%,而絕緣體只有0%-20%。高反射度導致只有很少的光線能進入導體表面之下發生散射,這也就是為什么導體通常表現的很有“金屬光澤"。

第二,導體的反射度針對不同的可見光譜是不同的,這就導致導體能反射出有顏色的光。這種帶顏色的反射導體很少,但生活中卻很常見。如:金、銅反射出黃色。而絕緣體則沒有此種特性,總是反射所有的光線。

最后一點,導體理論上講只會吸收光線而不會散射光線的。但實際上物體材質總有或多或少的雜質與表面污跡,所以金屬類材質也會發生少許的散射。

正因為金屬的這些特性,所以很多渲染系統中都單獨為材質引入了一個屬性“金屬度”(Metalness)。這只是方便美術進行材質的調節,并非PBR所必須的。如星際爭霸二的材質就沒有金屬度這個屬性,但仍然能表現出人族和神族單位的金屬材質。

菲涅耳

菲涅耳是一種反射現象,最早由奧古斯汀-讓·菲涅爾發現,因此被以非聶耳反射命名。

從計算機圖形學來解釋的話,就是隨著入射光線相對與表面法線的夾角越大,反射率就越大。也就是說在物體邊緣的反射會比中間要亮。在早期的渲染中也有引入菲涅耳反射,但在PBR中進一步完善相關計算公式的幾個方面。

第一點,所有的材質,在其“邊緣”(入射光線與物體表面角度無限趨近于0度)都會發生完美的鏡面反射,且反射所有顏色的光線。這可能是很難想象的,但在物理上已經被證實了。

第二點,不同材質的菲涅耳反射隨著角度的變化可以用曲線表示,并且相差都不大。不同金屬材質之間差異雖然會更大,但仍然能夠被分析并且公式化。因此藝術家們可以很方便的定義幾種預定義的材質模板,并在他們之間調整參數就能創造出不同的材質了。

這兩點可以由下圖很好的解釋:

從上圖曲線可以看出我們要實現菲涅耳反射非常簡單,只需要美術定義出中心最小的反射度,然后程序更具特定的公式計算出不同角度的實際反射度。就可以實現菲涅耳反射了。

微表面

以上的理論都是基于宏觀的,然而在微觀世界中,物體的表面不可能是絕對平滑的,總有一些或多或少的溝壑。這就導致了反射光線并不是總是平行的。

如下圖:

因為微表面存在于微觀層面,所以如果使用數據描述的話,由于精度需要將會是海量數據,是任何系統都無法承受的。因此在PBR中我們定義了一個屬性“光澤度”(Gloss)或者“光滑度”(Smoothness),它的反屬性為“粗造度”(Roughness)。這樣就可以在渲染系統中通過光澤度貼圖加以描述了。

再次的能量守恒

這里的能量守恒和之前第2點提到的能量守恒不同,第2點是針對于入射光線,反射光線與散射光線,這里的守恒僅僅指反射光線。

反射光線由于微表面的作用造成了不同方向的反射,但總能量維持不變。

下圖可以方便理解這一點

從左到右光澤度一次增加,圖中的高光點越來越亮,但范圍越來越小,因此總亮度維持不變。

在老式的渲染系統中關于高光的實現通常都是錯誤的,隨著光澤度提高不是變的更亮就是變得更暗。


結語

至此,整個PBR都已介紹完畢,如有興趣了解具體實現的這里推薦一本書《基于物理的渲染-從理論到實踐》(Physically Based Rendering – From Theory to Implementation)。

本文作者:張恒(點融黑幫),游戲行業從業11年。做過2D、3D游戲。端游、頁游還有手游。既做客戶端也做服務端。現如今開始了HTML5 3D游戲新的歷程。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容