計(jì)算機(jī)圖形學(xué)的光學(xué)基礎(chǔ)&BRDF公式的推導(dǎo)

水了挺多文了,還是還是想寫點(diǎn)干貨的??紤]到dx,openGL,vulkan,metal教程和書籍都挺多了,而且講圖形API挺沒意思的,這次寫點(diǎn)偏數(shù)學(xué)的東西。這次內(nèi)容乍看非常簡單,但應(yīng)該已經(jīng)包含實(shí)時(shí)渲染和PBR中的很多關(guān)鍵知識(shí)。如果立志走CG的話是一定要看懂的。而且,這篇文章也可以幫助一些小伙伴判斷自己對圖形學(xué)是否真的感興趣。
光學(xué)的分類
幾何光學(xué)有兩個(gè)重要的分支,分別是幾何光學(xué)和波動(dòng)光學(xué)。
波動(dòng)光學(xué)
微觀視角
光在介質(zhì)中以波的形式傳播
可以解釋衍射, 涉等現(xiàn)象
以波長為研究對象,非常復(fù)雜
幾何光學(xué)
宏觀視角
可見光的波長非常短,可以忽略
在?λ→0?的情況下,光學(xué)定理可以用幾何學(xué)描述
光可以看做沿著直線傳播
圖形學(xué)的光學(xué)需求
? ? ? ?計(jì)算機(jī)圖形學(xué)中使用幾何光學(xué),但是幾何光學(xué)模型仍然過于復(fù)雜,因此,計(jì)算機(jī)圖形學(xué)中的幾何光學(xué)模型,相比物理學(xué)中的幾何光學(xué)模型繼續(xù)做了如下簡化:
物體表面是絕對光滑(smooth)的
光只可以被發(fā)射(emitted),反射(reflected)或者傳播(transmitted)
光速無窮大*(光以無限快的速度沿直線傳播)
在某些極其特殊的光照模型(需要光程差)中不適用,不過實(shí)時(shí)渲染中暫時(shí)沒有使用這些光照模型的可能
圖形學(xué)使用的幾何光學(xué)定理
? ? ? ?光入射到物體表面時(shí),同時(shí)發(fā)生反射和折射。

1. 反射定理
? ? ? ?光射到一個(gè)界面上時(shí),其入射光線與反射光線成相同角度
2. 折射定理
折射光線位于入射光線和界面法線所決定的平面內(nèi);
折射線和入射線分別在法線的兩側(cè);
入射角?θ1?的正弦和折射角?θ2?的正弦的比值,對折射率一定的兩種媒質(zhì)來說是一個(gè)常數(shù)。

3. 菲涅爾定理
? ? ? ?在計(jì)算機(jī)圖形學(xué)中,人眼看到的是物體表面反射的光,因此我們要求出物體表面反射部分光線的能量。

該公式在計(jì)算時(shí)依舊過于復(fù)雜,所以實(shí)際計(jì)算時(shí)一般使用菲涅爾反射能量公式的Schlick近似公式:

? ? ??
? ? ? ?反射率隨入射角變化曲線:
金屬:

非金屬:

金屬反射率隨入射角變化曲線

? ? ? ?接下來,我們就要嘗試由光學(xué)定理推導(dǎo)BRDF渲染方程,我以比較簡單的GGX BRDF為例。
1. 圖形學(xué)中幾何光學(xué)模型的限制

? ? ? ?目前為止的理論要求我們所處理的表面是絕對光滑的,但只有相當(dāng)于微觀原子尺寸上,表面才可能絕對光滑,在實(shí)際物體表面物體是有微小的無規(guī)則起伏的。
2. 微面元理論
? ? ? ?核心思想:使用一個(gè)統(tǒng)計(jì)分布函數(shù)來描述微觀尺寸
? ? ? ?假設(shè)我們能夠處理微觀尺寸,則來自同一個(gè)方向的光照會(huì)被反射至多個(gè)方向。那么只要能夠模擬這個(gè)行為,就能在像素尺寸模擬微觀結(jié)構(gòu)的光學(xué)行為。所以可以定義一個(gè)法線分布函數(shù),以代替單個(gè)像素的法線值。

3. 法線分布函數(shù)D
? ? ? ?法線分布函數(shù)表示微面元發(fā)現(xiàn)方向的統(tǒng)計(jì)分布。給定一個(gè)入射方向,一個(gè)微面元有多大概率朝向半向量方向。

? ? ? ?法線分布函數(shù)有各向同性、各向異性之分。
? ? ? ?對于GGX(二維函數(shù),園對稱),只需要表面的
粗糙度
半向量與法線的夾角

? ? ? ?法線分布函數(shù)雖然模擬了表面的凹凸的情況,但是缺忽略了一個(gè)問題,那就是微面元上光線被凹凸遮擋的問題。

? ? ? ?為了解決這個(gè)問題,引入一個(gè)陰影補(bǔ)償函數(shù)G,來模擬表面凹凸遮擋陰影的情況。
4. 雙向陰影遮擋函數(shù)G
? ? ? ?NDF假設(shè)所以微面元位于同一平面,不考慮實(shí)際幾何結(jié)構(gòu)導(dǎo)致的遮擋。它描述的是那些具有半向量法線的微面元中,有多少比例是同時(shí)被入射方向和反射方向看到的(或者說沒有被阻擋的),一般使用史密斯陰影函數(shù)。

用來補(bǔ)償?shù)年幱罢趽鹾瘮?shù)G是一個(gè)純粹的經(jīng)驗(yàn)?zāi)P?,沒有任何光學(xué)理論的支撐。函數(shù)?G1?表示光沒有被凹凸表面遮擋的概率。將入射光和反射光概率相乘就是整個(gè)光路光線不被遮擋的概率。所謂雙向,就是入射光和反射光兩個(gè)方向
? ? ? ?現(xiàn)在我們有了物體表面能量的表示方法。由于我們只關(guān)心反射能量,所以上述公式還要再乘以菲涅爾公式,就是物體表面的反射能量。
5. 雙向分布函數(shù)BRDF

D?為法線分布函數(shù)
F?為菲涅爾函數(shù)
G?為雙向陰影遮擋函數(shù)
4(n?l)?為微面元坐標(biāo)系向世界坐標(biāo)系變換的雅可比行列式
6. BRDF的物理性質(zhì)
赫姆霍茲互反律(Helmholtz reciprocity)
能量守恒*
? ? ? ?解釋一下BRDF的能量守恒。BRDF能量遵循如下公式。

? ? ? ?BRDF并不一定遵循能量守恒,只能保證反射出的總能量不大于入射的能量。就是說,BRDF模型發(fā)射光相比真實(shí)的物理情況可能要暗一些。
7. 其他常見的BRDF模型
Blinn-Phong,簡單快速,各向同性,表達(dá)能力有限:

Cook-Torrance,復(fù)雜一些,各向同性,可以較好地表達(dá)真實(shí)材質(zhì):

Ward,復(fù)雜一些,支持各向異性:

小結(jié)&吐槽
? ? ? ?最近幾年大火的PBR,其實(shí)就是這些東西。抽絲剝繭之后,其實(shí)也蠻簡單的吧。我還有一篇文章,講得是如何在unity中編寫B(tài)RDF著色器,雖然有了上面的理論基礎(chǔ)之后,任何有基本shader基礎(chǔ)的同學(xué)也應(yīng)該都能很輕易的編寫B(tài)RDF surface shader了。如果有人想看請?jiān)谠u論區(qū)說一下,畢竟如果到最后也沒兩三個(gè)人看的話,也挺沒意思的。
? ? ? ?接著是對B站專欄的一些吐槽,求盡快支持markdown啊,B站編輯器實(shí)在是難用。