PBR渲染——直接光照

標準光照模型

當光照射到物體表面時绣张,物體對光會產生反射、吸收关带、透射侥涵、折射、衍射等現(xiàn)象宋雏,反射和透射的光進入人的視覺系統(tǒng)独令,使我們能看到物體。為模擬這一現(xiàn)象好芭,我們建立一些數學模型來替代復雜的物理模型燃箭,這些模型就稱為光照模型。 標準光照模型計算公式如下:

? ? 顏色 = 自發(fā)光 (emissive)+ 高光反射(specalur)+漫反射(diffuse)+環(huán)境光(ambient)

自發(fā)光:材質的自發(fā)光顏色舍败。

環(huán)境光:通過周圍的環(huán)境物體反射光的部分來模擬間接光照招狸。

高光反射:我們假定物體表面光滑,只有一個鏡面邻薯,那么所有的光都被反射向了同一個方向裙戏,這就是高光反射。受視角方向厕诡、光照方向累榜、表面法線的影響,從不同角度觀察灵嫌,得到的結果不一樣壹罚。在渲染中我們用BlinnPhong模型來表示高光反射。下面是該模型的計算公式

使用BlinnPhone模型計算高光反射

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Cspecular = (Clight *Mspecular)Max(0,\vec{n} *\vec{h} )^m

漫反射:漫反射是用于對物體表面隨機散射到各個方向的光照進行建模寿羞,在漫反射中猖凛,因為反射完全是隨機的,所以視角位置就不重要了绪穆,但是入射光線角度很重要辨泳。它的模型計算公式如下:

使用Lambert模型計算漫反射

? ? ? ? ? ? ? ? ? ? ? ? ? ??Cdiffuse = (Clight*Mdiffuse)max(0,\vec{n}*\vec{l}  )


PBR光照

PBR,基于物理的渲染玖院,全稱(Physically Based Rendering),是與現(xiàn)實世界物理學原理相符的理論構建的渲染模型菠红,使渲染的效果有跡可循,實現(xiàn)以真實物理參數為依據來編寫渲染材質难菌,得到具有物理意義的渲染效果试溯。Unity自帶的Standard Shader就是一個完整的PBR,但在實際使用中需要進行一些調優(yōu)扔傅。

PBR光照模型滿足下面三個條件:

? ? 1.基于微平面的表面模型耍共。

? ? 2.能量守恒烫饼。

? ? 3.應用基于物理的BRDF渲染模型。

微平面模型

所有的PBR技術都基于微平面理論试读。這項理論認為杠纵,達到微觀尺度之后任何平面都可以用被稱為微平面(Microfacets)的細小鏡面來進行描繪。根據平面粗糙程度的不同钩骇,這些細小鏡面的取向排列就不一致比藻。一個平面越是粗糙,這個平面上的微平面的排列就越混亂倘屹,當鏡面反射時银亲,入射光線更趨向于向不同的方向發(fā)散,然后產生范圍更廣泛的鏡面反射纽匙;與之想反务蝠,對于光滑的平面,光線大體上會更趨向于向同一個方向反射烛缔,造成更小更銳利的反射效果馏段。

我們一般用統(tǒng)計學的方法估算粗糙程度,粗糙度表示微平面上平均取向方向和半程向量方向一致的概率践瓷。半程向量的計算方法如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?h = \frac{l + v}{|l+v|}

微平面的取向方向與半程向量的方向越是一致院喜,鏡面反射的效果就越是強烈越是銳利。如下圖所示晕翠,當粗糙度越小的時候喷舀,反射更集中更亮,當粗糙度越大的時候淋肾,鏡面反射輪廓更大顏色更暗硫麻。

能量守恒

出射光線的能量永遠不能超過入射光線的能量。當一束光線碰撞到一個表面的時候巫员,它就會分離成一個折射部分和一個反射部分庶香。反射部分會直接反射開來甲棍,這就是我們所說的鏡面光照简识。折射部分就是余下會進入表面并被吸收的那部分光線,也就是漫反射光照感猛。

現(xiàn)實中光照能量不會被全部吸收七扰,光線會繼續(xù)沿著隨機的方向發(fā)散,然后與其他粒子碰撞直到能量耗凈或者再次離開這個表面讥邻,光線脫離物體表面會協(xié)同構成表面的漫反射顏色庭惜,這就是次表面散射(SubSurface Scattering)的原理,它會顯著提示皮膚敞峭,蠟像這樣材質的視覺效果,但伴隨的是性能下降的代價立由。在PBR渲染中我們對光照傳播進行了簡化轧钓,假設對平面上每一點所有的折射光都會被完全吸收而不會散開。

于是根據能量守恒锐膜,我們先計算鏡面反射毕箍,折射部分就可以直接由鏡面反射部分計算得出:

float ks = calculate_specular(); ?//鏡面反射

float kd = 1.0 - ks; ?//漫反射

BRDF

雙向反射分布函數,這是PBR的核心道盏,是如今我們所擁有的用來模擬光的視覺效果最好的模型而柑。渲染方程如下:

? ? ? ? ? ? ? ? ? ? ?L_{0} (p,w_{0})= \int_{\Omega }^{} (k_2oimum1 \frac{c}{\pi } + k_{s} \frac{DGF}{4(w_{0} .n)(w_{i} .n)} )L_{i} (p,w_{i})(w_{i}.n )dw_{i}


半球積分\int_{\Omega }^{} 表示多光源下光照的疊加。如果只考慮單個不衰減的直線光照荷逞,這個半球積分可以去掉

? ? ? ? ? ? ? ? ? ??L_{0} (p,w_{0})= (k_fw65hb9 \frac{c}{\pi } + k_{s} \frac{DGF}{4(w_{0} .n)(w_{i} .n)} )L_{i} (p,w_{i})(w_{i}.n )dw_{i}

用比較通用的語言解釋下媒咳,大概是這樣的

輸出顏色=(漫反射比例\cdot \frac{紋理顏色}{\pi } +鏡面反射比例\cdot \frac{鏡面高光\cdot 幾何陰影\cdot 菲涅爾項}{4(v\cdot n)(l\cdot n)} )\cdot 光源顏色\cdot (l\cdot n)

如果把鏡面反射比例設置為0,那么漫反射比例就為1种远,公式就可表示為如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?輸出顏色=(\frac{紋理顏色}{\pi } )\cdot 光源顏色\cdot (l\cdot n)

這個就和Lambert漫反射光照模型差不多了涩澡,不一致的是除了這個π,把對應的漫反射亮度調低了坠敷。這里簡單解釋下除以π的原因筏养, dw在輻射學里表示立體角,這里我們表示視角常拓,用公式表示為?dw = \sin \theta d\theta d\phi 渐溶,?通過積分計算可以得出半球積分\int_{\phi =0}^{2\pi } \int_{\theta =0}^{\pi /2} \cos \theta  \sin \theta d\theta d\phi =\pi ,如果散射的光線最后都能匯集到一點的話弄抬,積分的結果就是會再乘一個π茎辐,而BRDF要求在半球內的積分值不大于1。所以分散的時候就需要除π掂恕。


\frac{鏡面高光*幾何陰影*菲涅爾項}{4(v  \cdot n )(l\cdot n)} ,這個叫做Cook-Torrance的BRDF光照公式拖陆,表示鏡面反射部分,分子上的3個系數含義如下:

鏡面高光:法線分布函數(NDF)

估算在受到表面粗糙度的影響下懊亡,取向方向與中間向量h一致的微平面的數量依啰。舉例來說,假設給定向量h店枣,如果我們的微平面有35%與向量h取向一致速警,則法線分布函數會返回0.35.目前NDF公式用的是Trowbridge-Reitz GGX那一套,公式如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NDF_{GGXTR}(n,h,a) = \frac{x^2 }{\pi ((n.h)^2(a^2-1 ) +1)^2 }

h表示中間向量鸯两,a表示粗糙度闷旧。

在不同粗糙度參數下,我們可以得到如下圖示的效果:

當粗糙度很低時候钧唐,與中間向量取向一致的微平面會高度集中在一個很小的半徑范圍內忙灼。由于這種集中性,NDF最終會生成一個非常明亮的斑點。但是當平面比較粗糙的時候该园,微平面取向就會隨機發(fā)散酸舍,與中間向量取向一致的微平面分布在一個大得多半徑范圍內,但是同時較低的集中性也會讓我們的效果顯得比較灰暗里初,這是符合物理現(xiàn)實的父腕。

GLSL的shader代碼如下:

幾何陰影:幾何函數(Geometry function)

描述的是微平面自成陰影的屬性。當一個平面比較粗糙的時候青瀑,平面表面上的微平面有可能擋住其他的微平面從而減少表面所反射的光線璧亮。

它采用的是Schlick-GGX那一套公式

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?G(n,v,l,k)=G_{sub} (n,v,k)G_{sub} (n,l,k)

其中Gsub公式如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??G_{schlickGGX} (n,v,k) = \frac{n.v}{(n.v)(1-k)+k}


k是粗糙度a基于幾何函數針對直接光照或者IBL光照的重映射:

? ? ? ? ? ? ? ? ? ? ? ? ? ?k_{direct} =\frac{(a+1)^2 }{8} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? k_{IBL} =\frac{a^2 }{2}

下圖是不同粗糙度對應的亮度情況

表現(xiàn)出來的效果就是粗糙度越大,亮度越低斥难。但視線和光線接近垂直時枝嘶,受粗糙度的影響就越小,也比較符合現(xiàn)實哑诊。

k的取值范圍都是逐漸逼近1/2.直接光和間接光的差別在于群扶,直接光最小是1/8的吸收系數,而間接光沒有镀裤,這是因為完全不吸收光線的物體是不存在的竞阐,即使是完全光滑的物體,也能吸收一些光線暑劝。

GLSL的shader代碼如下:

菲涅爾方程:Fresnel equation

描述的是在反射的光線對比被折射的部分所占的比率骆莹,會隨著觀察的角度不同而改變。菲涅爾方程最早用在水體上担猛,因為水的粗糙度低反光能力強幕垦,卻又不是金屬,是菲涅爾效應最明顯的物體傅联。

當垂直觀察的時候先改,任何物體或者材質都有一個基礎反射率,但是如果與物體法線有一定角度去觀察的時候蒸走,所有的反光就會變得明顯仇奶。如果從與法線90度視角觀察,所有平面理論上都能完全反射光線比驻。這種現(xiàn)象因菲涅爾而聞名并體現(xiàn)在菲涅爾方程中该溯。菲涅爾Fresnel-Schlick版本的方程式如下:

? ? ? ? ? ? ? ? ? ? ??F_{Schick}(h,v,F0) = F0+(1-F0)(1-(h\cdot v)) ^5

F0是平面的基礎反射率,對于金屬物體而言嫁艇,菲涅爾其實并不明顯朗伶,因為金屬F0參數對不同顏色值的反射率是不同的,而且還需要和表面顏色相乘步咪,否則金屬看起來就會很假,于是對F0做了一次這樣的處理:

? ? ? ? ? ? ? ? ? ? ? ? ? ? F0=mix(vec3(0.04),表面顏色益楼,金屬度)

這個0.04代表絕緣體基本反射率猾漫,統(tǒng)計了大部分絕緣體取平均值得到点晴。

代入公式結果就比較符合金屬的物理屬性,對于非金屬悯周,金屬度較低粒督,即使乘了表面顏色影響也不大。

GLSL的shader代碼如下:

至此禽翼,關于PBR的直接光照部分就介紹完了屠橄,下一章介紹下PBR的IBL部分。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末闰挡,一起剝皮案震驚了整個濱河市锐墙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌长酗,老刑警劉巖溪北,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夺脾,居然都是意外死亡之拨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門咧叭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚀乔,“玉大人,你說我怎么就攤上這事菲茬∫仪剑” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵生均,是天一觀的道長听想。 經常有香客問我,道長马胧,這世上最難降的妖魔是什么汉买? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮佩脊,結果婚禮上蛙粘,老公的妹妹穿的比我還像新娘。我一直安慰自己威彰,他們只是感情好出牧,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歇盼,像睡著了一般舔痕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天伯复,我揣著相機與錄音慨代,去河邊找鬼。 笑死啸如,一個胖子當著我的面吹牛侍匙,可吹牛的內容都是我干的。 我是一名探鬼主播叮雳,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼想暗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帘不?” 一聲冷哼從身側響起说莫,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厌均,沒想到半個月后唬滑,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡棺弊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年晶密,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片模她。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡稻艰,死狀恐怖,靈堂內的尸體忽然破棺而出侈净,到底是詐尸還是另有隱情尊勿,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布畜侦,位于F島的核電站元扔,受9級特大地震影響,放射性物質發(fā)生泄漏旋膳。R本人自食惡果不足惜澎语,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望验懊。 院中可真熱鬧擅羞,春花似錦、人聲如沸义图。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碱工。三九已至娃承,卻和暖如春奏夫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背草慧。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工桶蛔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匙头,地道東北人漫谷。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像蹂析,于是被迫代替她去往敵國和親舔示。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容