本文目錄如下。

PBR中的光照

直接光源

間接光源

選擇BRDF

漫反射 BRDF:Lambert光照模型

鏡面反射 BRDF:Cook-Torrance光照模型

術語 :

在第一部分文章 中,我從美術的角度解釋瞭如何理解基於物理的渲染。如果你是一位研發人員,正在讀這篇文章,你可能已經嘗試過或計劃開發自己的

PBR系統

。倘若你已經開始閱讀了相關的文獻,也許會感嘆算數之複雜,而且會發現並沒有從整體視角分析PBR的文章。

通常,你會發現一些文章著重於對流程中特定某個部分的解釋,但卻較少涉及其他部分(因為他們覺得這部分更簡單,無需說明)。但有時候你需要整合所有的資訊,而我曾有很長一段時間不知道該如何整合我的閱讀知識。大抵其他作者認為這部分只是基本常識,我認為還是有必要對這些內容做出恰當的解釋。

若果你已經打算去實現自己的PBR系統,我覺得這篇文章並不會對你有很大的幫助,但我希望它能為你提供紮實的基礎和理解來閱讀其他文獻,而不是像我一樣,看到每一行字發出“什麼鬼?”的感嘆。

本文的結尾部分是術語表,說明和解釋生詞。

所以,下文是我在3D渲染管線中常用的PBR和光照知識的整理。

光照

首先我們來聊一下游戲中的光照。可以歸結為兩點:

計算

漫反射

:指光線從表面的各個方向反射出去。

計算

鏡面

反射:指光線從表面直接反射至眼睛。

下面維基百科的圖,能幫助你更好、更簡單地理解這兩個概念。

[譯] 面向美術師的基於物理的渲染(PBR)指南 _2

By GianniG46 (Own work) [CC-BY-SA-3。0 (http://creativecommons。org/licenses/by-sa/3。0) or GFDL (http://www。gnu。org/copyleft/fdl。html)], via Wikimedia Commons

為了計算出這些光照的分佈,我們將使用一個函式。這個函式是

雙向反射分佈函式(BRDF)。

不用慌,這不過是函式的名稱而已。通常它指一個著色器(shader)功能。

當然,根據你想要計算的內容和使用的光照模型不同,對應的BRDF也不一樣。BRDF通常以發明/解釋它們的人名來命名。同樣,在大多數情況下,在實時渲染的工作流程中,考慮效能問題,會對這些BRDF進行近似最佳化。順便說一下,這些近似也都有命名,以人名或技術命名……

PBR中的光照

PBR的光照計算與當前渲染完全相同(現在我們使用的系統包含環境,漫反射,鏡面反射,有時在文獻中叫做ad-hoc系統):計算每個光源的漫反射係數和鏡面反射係數。主要區別在於使用的BRDF不同,

物理精度

更高,且在輸入很少引數的情況下,在不同光源下正常執行。

那,什麼是光源?

直接光源

發光體

。在遊戲中,最常見的直接光源是定向光(太陽),聚光燈(火炬),點光源(燈泡)。這就是ad-hoc系統中常用的光源,PBR中亦如此。

間接光源

指反射光線,間接照亮周圍環境的光源。例如,在大白天,汽車停在紅色的牆壁旁,陽光直射牆壁,牆壁反射紅光,繼而照亮汽車。

ad-hoc系統不能處理這個光照過程,即便處理了,效果也很不好。

PBR流程中提供此功能選擇,這正中你意,因為這些會讓畫面看上去更好看!在遊戲中是使用

環境貼圖

作為光源實現間接光照,此技術叫做

基於影象的照明(IBL)

如果考慮完整的光線表現,我們需要為每個光源計算直接或間接的漫反射和鏡面反射的貢獻值。為此,我們需要一個BRDF來實現漫反射,另一個BRDF實現鏡面反射,而且每個光源都要遵循他們,以保持一致性。同時,這些

BRDF函式

也應該能夠接受引數(如美術可調節基色、金屬度、

粗糙度

)和變換後的派生引數的輸入。

因此,完整光照的虛擬碼如下:

//direct lighting

for each directLightSource {

directDiffuseFactor = DiffuseBRDF(directlightSource)

directSpecularFactor = SpecularBRDF(directLightSource)

directLighting += Albedo * directDiffuseFactor + SpecColor * directSpecularFactor

}

//Indirect Lighting, done through Image Based Rendering with an

environment map

indirectDiffuseFactor = DiffuseBRDF(EnvMap)

indirectSpecularFactor = SpecularBRDF(EnvMap)

indirectLighting = Albedo * indirectDiffuseFactor + SpecColor * indirectSpecularFactor

Lighting = directLighting + indirectLighting

我會在接下來的帖文中詳細介紹如何計算各個因素,不會深入介紹。

選擇BRDF

可供選擇的BRDF很多,但在本文中我不會一一討論,我會把重點放在我用過的實現方式上。我會告訴你有哪些其他可選的方案,並提供相關論文和連結。

我選擇了用Brian Karis 文章 中的UE4 BRDF,我完全相信他的判斷。他提供的程式碼給了我很大的幫助,但離最後的整合還差很遠。所以最後我只能靠自己開始全面研究,著手瞭解所有關於BRDF的知識。

漫反射 BRDF:Lambert光照模型

蘭伯特Lambert是遊戲中最常用的漫反射BRDF。它的計算成本非常低,效果好,所以也備受歡迎。這也是計算漫反射方法中最簡單的一種。詳細請參考

[譯] 面向美術師的基於物理的渲染(PBR)指南 _2

黃色表面顏色的直接光源(定向光)的漫反射Lambert因子。

其他可選方案:

Oren-Nayar

: 較之經典的Lambert光照模型,Oren-Nayar模型能實現更佳的視覺效果,還可調節粗糙度引數……請注意,糟糕的是,我個人覺得額外的計算開銷真的不值得 細節請點選

Harahan-Krueger

: 考慮用於漫反射光照的次表面散射(每個材質表面都有很多層,光線從隨機方向散射進入不同的層直至離開材質。)相比Lambert光照模型,Harahan-Krueger模型的計算量更大,但可得到很好的SSS效果,如面板。 更多細節請參考論文

鏡面反射 BRDF:Cook-Torrance光照模型

鏡面反射BRDF相對來說更復雜一些。我們需要一個物理上合理的BRDF。我們用

Microfacet BRDF

。那麼,什麼是Microfacet BRDF?

Microfacet BRDF是指,在

微觀層面

上,表面不是一個光滑的平面,而是由無數方向不同的隨機排列的表面(微表面)構成的面。這些表面視作反射入射光線的微小鏡面。 BRDF背後的概念是,這些表面中只有一部分可以確定朝向,使得入射光線反射至人眼。越光滑的表面,對齊的面越多,光的反射越整齊有序。相反,如果表面粗糙,則微表面的朝向更隨機,光線反射會散射在表面上,使得反射看起來會更模糊。

[譯] 面向美術師的基於物理的渲染(PBR)指南 _2

直接光源的微表面鏡面反射因子。左邊是光滑的表面,右邊是粗糙的表面。請注意觀察粗糙表面上的反射是如何散佈的。

我們使用的microfacet BRDF叫Cook-Torrance光照模型。我找不到其他鏡面反射BRDF的實現。Cook-Torrance光照模型好像是所有microfacet BRDF通用的形式。

f = D * F * G / (4 * (N。L) * (N。V));

N.L

是著色表面法線和光線方向的點積。

N.V

是著色表面法線和視線方向的點積。

其他術語如下:

D 法線分佈函式

(用於分佈)。你也許會發現在有些資料上它叫NDF。用於計算著色表面的微面分布。

F 菲涅爾因數

。 它是由奧古斯丁·菲涅爾(Augustin Fresnel)發現的。(法國人忒聰明瞭)。用於描述光線在兩個不同的介質(最常見於計算機圖形學:空氣和著色表面)的交匯處反射和折射。

G 幾何陰影項

。 用於定義微表面的陰影。

現在開始變複雜了。對於每個術語,都有一些模型和近似來計算他們。

我決定使用這些模型和近似:

D : Trowbridge-Reitz/GGX

法線分佈函式

F : 菲涅爾術語 Schlick

的 近似

G : Schlick-GGX

近似

我大概先過一遍整個流程,但不會詳細介紹所有的可選方案。但在後續文章中,我將深入介紹這些術語涵蓋的更多技術細節。想全面瞭解所有的可選方案,請查閱Brian Karis的 部落格 。

雖然我總結了整個流程,但是還有很多地方值得去一一解釋。在下一篇文章中,我將重點介紹間接光照,這曾是讓我最頭痛的一部分。與此同時,我也將介紹基於影象的渲染(IBL)技術和從環境貼圖中計算漫反射和鏡面反射的方法。

術語:

漫反射:

從表面各個方向反射的光線。

鏡面反射:

從表面向觀察者反射的光線。

雙向反射率分佈函式或BRDF:

用於計算漫反射和鏡面反射的函式。

基於影象的渲染或IBL:

使用影象作為光源的技術。

Microfacet Specular BRDF微面鏡面BRDF :

假設表面的鏡面BRDF是由許多非常小的隨機對齊的表面組成—微表面。它取決於D,F和G這三個因素。

D 法線分佈函式:

(用於分佈)你也許會發現在有些資料上它叫做NDF。用於計算著色表面的微面分布。

F 菲涅爾因數:

它是由奧古斯丁·菲涅爾(Augustin Fresnel)發現的。(法國人忒聰明瞭)。用於描述光線在兩個不同的介質(最常見於計算機圖形學:空氣和著色表面)的交匯處反射和折射。

G 幾何陰影項:

用於定義微表面的陰影。

本文僅限於學習參考交流,請勿做商業用途和隨意轉載。

譯 Qinfei

2019。10。22