五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

PBR物理光照計(jì)算公式推導(dǎo)詳解

2022-08-31 16:55 作者:游戲開(kāi)發(fā)RAIN  | 我要投稿

PBR物理光照Shader很多游戲引擎已經(jīng)自帶了,但是我們?cè)诙ㄖ其秩竟芫€,優(yōu)化渲染效果與修改Shader的時(shí)候需要對(duì)這些理論做一些基本的了解,才能修改的得心應(yīng)手,今天我們對(duì)PBR物理光照的基本公式的原理來(lái)做一次數(shù)學(xué)推導(dǎo),幫助大家掌握PBR Shader的基本計(jì)算原理,為后續(xù)做優(yōu)化和定制做好準(zhǔn)備,而這個(gè)也是面試時(shí)候必備,正在面試的同學(xué)可以來(lái)刷下這個(gè)文章。

主要的概念梳理

本文用到的一些概念,先在梳理一下,方便大家對(duì)照:






具體公式推導(dǎo)

我們先從經(jīng)驗(yàn)光照模型的Blinn-Phong開(kāi)始,然后再逐步的演變推導(dǎo)到物理PBR模式。

Blinn-Phong光照計(jì)算的公式如下:

這個(gè)公式表明: 光照計(jì)算= 漫反射+高光反射。

有了上面的約定后,我們把公式調(diào)整替換一下,如圖:

這個(gè)公式比較簡(jiǎn)單,計(jì)算起來(lái)GPU的性能比較好,但是效果可能不那么好,所以接下來(lái),我們來(lái)對(duì)某些參數(shù)來(lái)做一些調(diào)整,如圖:

注意看這個(gè)公式前后兩大變化:

a:漫反射系數(shù)改變了,增加了一個(gè) 1/PI的系數(shù),它會(huì)讓我們?cè)诮o光源設(shè)置Diffuse的時(shí)候更加直觀,高光系數(shù)改變了, 增加了一個(gè)系數(shù) (m+8)/8*PI ,這個(gè)系數(shù)很有意思, 原老公式中,m越大高光的光斑越集中,加上這個(gè)參數(shù)后我們發(fā)現(xiàn),m越大除了讓光斑越集中,還能讓高光更亮。這是很合理的物理現(xiàn)象,光的能量越密集,單位面積上的強(qiáng)度就越大,總能量不變。這個(gè)做法叫“歸一化”;我們來(lái)對(duì)比一下前后變化,如圖:

b:提取了公因式cos θL,有點(diǎn)類似Diffuse了。這個(gè)其實(shí)是更接近真實(shí)的物理模擬情況,因?yàn)樗泄饩€照射的效果都需要考慮受光面傾斜的情況,只是老公式認(rèn)為在高光部分這個(gè)影響不明顯,于是省略掉以節(jié)省性能開(kāi)銷(xiāo)。


提取完供因式以后, 我們看括號(hào)里的部分,這就是著名的BRDF。BRDF不是一個(gè)公式,是一類公式,學(xué)名“雙向反射分布函數(shù)”(注:有的BRDF函數(shù)離真實(shí)物理法則更接近,有的則假得一逼。常用的Unity引擎中就包含了三套BRDF公式,用作不同性能機(jī)型的適配)。于是我們的公式演變?nèi)缦?

我們來(lái)看下基于BRDF結(jié)構(gòu)下的Blinn-Phong光照計(jì)算公式:

第一部分Cdiff/PI:是一個(gè)Lambert光照公式,用來(lái)計(jì)算Diffuse;

第二部分是高光部分,用來(lái)計(jì)算高光反射:

這個(gè)公式的作用是控制高光產(chǎn)生的光斑的集中度。以一個(gè)球體為例,越接近光斑中心,半角向量和法線的夾角越小,高光越亮,越到光斑外圍,半角向量和法線的夾角越大,高光越弱。聽(tīng)上去挺合理,但翻開(kāi)物理課本回顧一下就會(huì)發(fā)現(xiàn):理論上只有半角向量和法線完全重合的時(shí)候才有反射光線被視線接收到,憑什么這里還能允許它們存在夾角?而且?jiàn)A角的變化還導(dǎo)致反射光線強(qiáng)度的變化,這個(gè)怎么來(lái)的?這里又有新理論,叫微表面理論。我們?cè)阡秩局惺侵饌€(gè)像素進(jìn)行處理的,每個(gè)像素雖然足夠小了,但在這個(gè)像素覆蓋的范圍內(nèi)還有無(wú)數(shù)細(xì)微的起起伏伏的物理結(jié)構(gòu),有起伏,就會(huì)有變化的法線。我們渲染時(shí)用到那個(gè)像素法線只能算是所有細(xì)微面的法線的平均值,實(shí)際上這個(gè)像素點(diǎn)內(nèi)部朝各個(gè)方向的法線都是有的,只是所占比例有所不同。

在渲染時(shí),當(dāng)然不會(huì)把像素內(nèi)部的法線逐個(gè)取出來(lái)再去計(jì)算光照,我們只需要把能反射到視線的法線所占的比例找出來(lái),用它將高光強(qiáng)度修正一下就好了。其實(shí)我們常說(shuō)的“半角向量”就是指能反射到視線的法線。

而我們討論的 高光部分的公式就是做這個(gè)事,它根據(jù)半角向量和平均法線的夾角,計(jì)算出指向半角向量方向的微表面法線的比例。這個(gè)函數(shù)叫做 “法線分布函數(shù)”,文中我們以D來(lái)表示。

然后我們的BRDF函數(shù)就演變成這樣:

法線分布函數(shù)能解釋表面上細(xì)微的凹凸不平對(duì)光的反射產(chǎn)生的影響,但是有一個(gè)前提:微表面上所有的點(diǎn)都能夠接受到光線,并且能夠反射出光線,事實(shí)上真實(shí)的物理表面大部分是達(dá)不到這樣的條件的,如圖所示

由于自身的遮擋,有很多點(diǎn)根本無(wú)法接受到入射光線,也有很多點(diǎn)反射的光線無(wú)法射出表面。因此,我們此處再定義一個(gè)函數(shù)叫“可見(jiàn)性函數(shù)”,用V表示。它的作用就是根據(jù)給定的入射光線和出射光線的方向,計(jì)算出不被自身遮擋的光線的比例,上面的BRDF公式就演變成如圖所示:

高光強(qiáng)度 Cspec,在公式中,這是個(gè)常量,但卻不是符合真實(shí)物理規(guī)律的。在物理書(shū)講反射與折射的章節(jié)上我們學(xué)過(guò),在一個(gè)反射面上,當(dāng)入射角度越“傾斜”,反射的光線越多,折射的光線越少,入射角度越“直”,折射的光線越多,反射的越少。這個(gè)現(xiàn)象叫做菲涅爾現(xiàn)象。所以這里的高光強(qiáng)度需要用一個(gè)函數(shù)來(lái)表示,記作F。這樣基于經(jīng)驗(yàn)?zāi)P偷腂linn-Phong光照公式被調(diào)整成有物理意義的公式模板,如圖:

盡管如此,從物理公式的角度我們來(lái)分析一下Blinn-Phong光照之所以效果不好的原因:


為了提升渲染效果, PBR 根據(jù)物理的理論引入了一些公式,如下:


法線分布函數(shù)D:

找一個(gè)更符合物理規(guī)律并且更容易控制的函數(shù)來(lái)代替原有的法線分布函數(shù)。在各種常見(jiàn)的PBR模型中被廣泛使用的是Trowbridge-Reitz GGX函數(shù):

其中,Roughness就是我們常說(shuō)的“粗糙度”,取值范圍為0到1,當(dāng)取值為1時(shí)表示最粗糙的表面,完全沒(méi)有任何高光反射。這一點(diǎn)可以從公式中看出來(lái) (注:有的系統(tǒng)例如Unitiy里用“光滑度”來(lái)代替粗糙度,它們的關(guān)系是:粗糙度 = 1 - 光滑度)。


菲涅爾系數(shù)F:

當(dāng)光垂直射向表面時(shí),折射光線最多,反射光線最少,假設(shè)此時(shí)的菲涅爾系數(shù)是F0,那么在給定任意角度的時(shí)候,引入下面公式來(lái)近似的表示這個(gè)系數(shù)

其中F0是在限定條件下折射和反射的比例,由物質(zhì)的分子結(jié)構(gòu)決定。是物質(zhì)的天然屬性。每一種物質(zhì)都不相同。用一個(gè)更常見(jiàn)的說(shuō)法,它叫做“反射率”。通常通一種物質(zhì)對(duì)不同頻譜的光反射率是不一樣的,所以不管是F還F0是都是一組RGB三通道的值。

它的值到底是多少呢?先看一組通過(guò)真實(shí)物理實(shí)驗(yàn)得到的數(shù)據(jù):


我們可以看到,非金屬的反射率都非常小,而金屬的反射率則比較高,大部分在0.5以上,RGB三個(gè)通道的差異體現(xiàn)了這種金屬的顏色,值越大則金屬越“亮”。


因此,對(duì)于非金屬,我們其實(shí)可以用統(tǒng)一的一個(gè)比較小的值作為F0(例如Unity引擎里將這個(gè)值定為常數(shù)(0.04, 0.04, 0.04)),對(duì)于金屬,我們以金屬自身顏色Albedo作為它的值。理論上一種物質(zhì)要么是金屬,要么是非金屬,不會(huì)出現(xiàn)介于金屬和非金屬之間的狀態(tài)。但實(shí)際我們做3D渲染的時(shí)候,一個(gè)像素面積內(nèi)是可能同時(shí)包含金屬和非金屬的。為了準(zhǔn)確描述這種現(xiàn)象,我們定義一個(gè)值叫做“金屬度”,當(dāng)它為1時(shí),反射率完全按金屬的方式處理,為0時(shí),完全按非金屬的方式處理。當(dāng)取值在0和1之間時(shí),通過(guò)線性插值確定反射率,如下:

可見(jiàn)性函數(shù)V:

可見(jiàn)性函數(shù)是描述光線從入射到出射的過(guò)程中,有多少比例被微表面自身的凹凸不平遮擋主了。這個(gè)部分其實(shí)和法線分布有點(diǎn)像,依據(jù)的是表面的粗糙程度。為了準(zhǔn)確描述,我們首先需要這樣的一個(gè)函數(shù):給一個(gè)方向,獲得微表面在這個(gè)方向上被自遮擋的面積的比例。引入Schlick-GGX函數(shù)公式:

公式中的k其實(shí)是對(duì)粗糙度的一個(gè)簡(jiǎn)單變形,在只考慮一個(gè)固定方向的情況下,這個(gè)變形的公式為:

我們最終計(jì)算的可見(jiàn)性分了三部分:入射光線沒(méi)被遮擋的部分、出射光線沒(méi)被遮擋的部分、入射光線被遮擋后,在微表面內(nèi)部多次反射又射出的部分。我們省略掉推導(dǎo)過(guò)程后,得到的公式是這樣:

這就是我們的可見(jiàn)性函數(shù)了。

BRDF公式也就演變成:

其中V、D、F三個(gè)部分我們都已經(jīng)給出了物理公式,最后就是考慮能量守恒了。


光照能量守恒:

我們通常會(huì)把光照效果分為漫反射和鏡面反射(既高光)兩部分。 傳統(tǒng)意義上說(shuō)的“漫反射”是指凹凸不平的表面反射的沒(méi)有方向性的光。但是我們已經(jīng)在高光部分充分考慮了物體微表面的變化了啊。而且事實(shí)上我們把粗糙度調(diào)整為1時(shí),效果跟我們預(yù)期的“漫反射”就是一樣的。

而現(xiàn)在BRDF公式中的Diffuse實(shí)質(zhì)上是這樣的:光線射到表面上后,部分被反射,部分被折射而進(jìn)入材質(zhì)內(nèi)部,在材質(zhì)內(nèi)部經(jīng)過(guò)多次不規(guī)則的折射、反射后,部分光線被吸收,部分光線又從離射入點(diǎn)不遠(yuǎn)的地方射出來(lái),這里的“不遠(yuǎn)”是指映射到屏幕后小于一個(gè)像素的大小。所以反射率越高,則越多的光線被直接反射,越少的光線進(jìn)入材質(zhì)內(nèi)部,Diffuse就越低。反之亦然。所以我們還需要兩個(gè)系數(shù)來(lái)修正Specular和Diffuse兩部分,分別稱作 Kspec和Kdiff, 如下

我們根據(jù)能量守恒的原則可知,

根據(jù)這樣過(guò)的幾個(gè)性質(zhì),我們得到這樣的近似的關(guān)系:


首先高光系數(shù)其實(shí)就是前文所描的反射率F0

然后,Diffuse系數(shù)則是剩余部分扣除吸收的光線,而吸收的光線比例通過(guò)金屬度來(lái)近似模擬:

這樣整個(gè)PBR的公式的由來(lái)就大體的全部講解了一遍,寫(xiě)Shader的時(shí)候,只要對(duì)著公式的模板來(lái)整理出來(lái)不同Shader描述不同函數(shù)的公式,這樣看懂它最終PBR Shader的寫(xiě)法。

加入我的游戲開(kāi)發(fā)交流群,
給你分享更多游戲源碼及其他學(xué)習(xí)素材


PBR物理光照計(jì)算公式推導(dǎo)詳解的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
和田县| 鹤峰县| 万山特区| 平原县| 万盛区| 开江县| 乃东县| 若尔盖县| 壤塘县| 潼南县| 东阿县| 上杭县| 永安市| 白山市| 湘西| 霍城县| 武隆县| 高唐县| 大姚县| 滨州市| 临猗县| 千阳县| 勃利县| 阳新县| 恩平市| 深州市| 贡觉县| 台州市| 久治县| 宣城市| 新源县| 临城县| 常德市| 巴里| 蛟河市| 阿巴嘎旗| 剑阁县| 顺义区| 吉安县| 阿城市| 民权县|