標準光照模型
當光照射到物體表面時绣张,物體對光會產生反射、吸收关带、透射侥涵、折射、衍射等現(xiàn)象宋雏,反射和透射的光進入人的視覺系統(tǒng)独令,使我們能看到物體。為模擬這一現(xiàn)象好芭,我們建立一些數學模型來替代復雜的物理模型燃箭,這些模型就稱為光照模型。 標準光照模型計算公式如下:
? ? 顏色 = 自發(fā)光 (emissive)+ 高光反射(specalur)+漫反射(diffuse)+環(huán)境光(ambient)
自發(fā)光:材質的自發(fā)光顏色舍败。
環(huán)境光:通過周圍的環(huán)境物體反射光的部分來模擬間接光照招狸。
高光反射:我們假定物體表面光滑,只有一個鏡面邻薯,那么所有的光都被反射向了同一個方向裙戏,這就是高光反射。受視角方向厕诡、光照方向累榜、表面法線的影響,從不同角度觀察灵嫌,得到的結果不一樣壹罚。在渲染中我們用BlinnPhong模型來表示高光反射。下面是該模型的計算公式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
漫反射:漫反射是用于對物體表面隨機散射到各個方向的光照進行建模寿羞,在漫反射中猖凛,因為反射完全是隨機的,所以視角位置就不重要了绪穆,但是入射光線角度很重要辨泳。它的模型計算公式如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ??max(0%2C%5Cvec%7Bn%7D*%5Cvec%7Bl%7D%20%20))
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)計學的方法估算粗糙程度,粗糙度表示微平面上平均取向方向和半程向量方向一致的概率践瓷。半程向量的計算方法如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
微平面的取向方向與半程向量的方向越是一致院喜,鏡面反射的效果就越是強烈越是銳利。如下圖所示晕翠,當粗糙度越小的時候喷舀,反射更集中更亮,當粗糙度越大的時候淋肾,鏡面反射輪廓更大顏色更暗硫麻。
能量守恒
出射光線的能量永遠不能超過入射光線的能量。當一束光線碰撞到一個表面的時候巫员,它就會分離成一個折射部分和一個反射部分庶香。反射部分會直接反射開來甲棍,這就是我們所說的鏡面光照简识。折射部分就是余下會進入表面并被吸收的那部分光線,也就是漫反射光照感猛。
現(xiàn)實中光照能量不會被全部吸收七扰,光線會繼續(xù)沿著隨機的方向發(fā)散,然后與其他粒子碰撞直到能量耗凈或者再次離開這個表面讥邻,光線脫離物體表面會協(xié)同構成表面的漫反射顏色庭惜,這就是次表面散射(SubSurface Scattering)的原理,它會顯著提示皮膚敞峭,蠟像這樣材質的視覺效果,但伴隨的是性能下降的代價立由。在PBR渲染中我們對光照傳播進行了簡化轧钓,假設對平面上每一點所有的折射光都會被完全吸收而不會散開。
于是根據能量守恒锐膜,我們先計算鏡面反射毕箍,折射部分就可以直接由鏡面反射部分計算得出:
float ks = calculate_specular(); ?//鏡面反射
float kd = 1.0 - ks; ?//漫反射
BRDF
雙向反射分布函數,這是PBR的核心道盏,是如今我們所擁有的用來模擬光的視覺效果最好的模型而柑。渲染方程如下:
? ? ? ? ? ? ? ? ? ? ?
半球積分表示多光源下光照的疊加。如果只考慮單個不衰減的直線光照荷逞,這個半球積分可以去掉
? ? ? ? ? ? ? ? ? ??
用比較通用的語言解釋下媒咳,大概是這樣的
如果把鏡面反射比例設置為0,那么漫反射比例就為1种远,公式就可表示為如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
這個就和Lambert漫反射光照模型差不多了涩澡,不一致的是除了這個π,把對應的漫反射亮度調低了坠敷。這里簡單解釋下除以π的原因筏养, dw在輻射學里表示立體角,這里我們表示視角常拓,用公式表示為?渐溶,?通過積分計算可以得出半球積分
,如果散射的光線最后都能匯集到一點的話弄抬,積分的結果就是會再乘一個π茎辐,而BRDF要求在半球內的積分值不大于1。所以分散的時候就需要除π掂恕。
,這個叫做Cook-Torrance的BRDF光照公式拖陆,表示鏡面反射部分,分子上的3個系數含義如下:
鏡面高光:法線分布函數(NDF)
估算在受到表面粗糙度的影響下懊亡,取向方向與中間向量h一致的微平面的數量依啰。舉例來說,假設給定向量h店枣,如果我們的微平面有35%與向量h取向一致速警,則法線分布函數會返回0.35.目前NDF公式用的是Trowbridge-Reitz GGX那一套,公式如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
h表示中間向量鸯两,a表示粗糙度闷旧。
在不同粗糙度參數下,我們可以得到如下圖示的效果:
當粗糙度很低時候钧唐,與中間向量取向一致的微平面會高度集中在一個很小的半徑范圍內忙灼。由于這種集中性,NDF最終會生成一個非常明亮的斑點。但是當平面比較粗糙的時候该园,微平面取向就會隨機發(fā)散酸舍,與中間向量取向一致的微平面分布在一個大得多半徑范圍內,但是同時較低的集中性也會讓我們的效果顯得比較灰暗里初,這是符合物理現(xiàn)實的父腕。
GLSL的shader代碼如下:
幾何陰影:幾何函數(Geometry function)
描述的是微平面自成陰影的屬性。當一個平面比較粗糙的時候青瀑,平面表面上的微平面有可能擋住其他的微平面從而減少表面所反射的光線璧亮。
它采用的是Schlick-GGX那一套公式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
其中Gsub公式如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
k是粗糙度a基于幾何函數針對直接光照或者IBL光照的重映射:
? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
下圖是不同粗糙度對應的亮度情況
表現(xiàn)出來的效果就是粗糙度越大,亮度越低斥难。但視線和光線接近垂直時枝嘶,受粗糙度的影響就越小,也比較符合現(xiàn)實哑诊。
k的取值范圍都是逐漸逼近1/2.直接光和間接光的差別在于群扶,直接光最小是1/8的吸收系數,而間接光沒有镀裤,這是因為完全不吸收光線的物體是不存在的竞阐,即使是完全光滑的物體,也能吸收一些光線暑劝。
GLSL的shader代碼如下:
菲涅爾方程:Fresnel equation
描述的是在反射的光線對比被折射的部分所占的比率骆莹,會隨著觀察的角度不同而改變。菲涅爾方程最早用在水體上担猛,因為水的粗糙度低反光能力強幕垦,卻又不是金屬,是菲涅爾效應最明顯的物體傅联。
當垂直觀察的時候先改,任何物體或者材質都有一個基礎反射率,但是如果與物體法線有一定角度去觀察的時候蒸走,所有的反光就會變得明顯仇奶。如果從與法線90度視角觀察,所有平面理論上都能完全反射光線比驻。這種現(xiàn)象因菲涅爾而聞名并體現(xiàn)在菲涅爾方程中该溯。菲涅爾Fresnel-Schlick版本的方程式如下:
? ? ? ? ? ? ? ? ? ? ??
F0是平面的基礎反射率,對于金屬物體而言嫁艇,菲涅爾其實并不明顯朗伶,因為金屬F0參數對不同顏色值的反射率是不同的,而且還需要和表面顏色相乘步咪,否則金屬看起來就會很假,于是對F0做了一次這樣的處理:
? ? ? ? ? ? ? ? ? ? ? ? ? ?
這個0.04代表絕緣體基本反射率猾漫,統(tǒng)計了大部分絕緣體取平均值得到点晴。
代入公式結果就比較符合金屬的物理屬性,對于非金屬悯周,金屬度較低粒督,即使乘了表面顏色影響也不大。
GLSL的shader代碼如下:
至此禽翼,關于PBR的直接光照部分就介紹完了屠橄,下一章介紹下PBR的IBL部分。