3D數(shù)學(xué)-基礎(chǔ)光照
好記性不如爛筆頭啊,還是記錄一下!
概述
我們要模擬真實(shí)的光照環(huán)境來生成一張圖像,需要考慮三種物理現(xiàn)象:
- 首先,光線從
光源(light source)
中發(fā)射出來。 - 然后防泵,光線和場(chǎng)景中的一些物體相交: 一些光線被物體吸收了励背,而另一些光線被散射到其他方向。
- 最后遥皂,攝像機(jī)吸收了一些光,產(chǎn)生了一張圖像氮发。
下面渴肉,我們將對(duì)每個(gè)部分進(jìn)行更加詳細(xì)的解釋。
光源
在實(shí)時(shí)渲染中爽冕,我們通常把光源當(dāng)成一個(gè)沒有體積的點(diǎn)仇祭,用來表示他的方向。那么颈畸,我們?nèi)绾螠y(cè)量一個(gè)光源發(fā)射出了多少光呢乌奇?也就是說没讲,我們?nèi)绾瘟炕饽兀吭诠鈱W(xué)里礁苗,我們通常用輻照度(irradiance)
來量化光爬凑。對(duì)于平行光來說,它的輻照度可通過計(jì)算在垂直于的單位面積上單位時(shí)間內(nèi)穿過的能量來得到试伙。在計(jì)算光照模型時(shí)嘁信,我們需要知道一個(gè)物體表面的輻照度,而物體表面往往時(shí)和不垂直的疏叨,那么如何計(jì)算這樣的表面的輻照度呢潘靖?我們可以使用光源方向和表面法線之間的夾角的余弦值來得到。需要注意的是蚤蔓,這里默認(rèn)方向矢量的模都為1卦溢。
由上圖可知輻照度是和照射到物體表面時(shí)光線之間的距離成反比的,因此輻照度就和成正比秀又。可以用光源方向和表面法線的點(diǎn)積
來得到单寂。這就是使用點(diǎn)積
來計(jì)算輻照度的由來。
環(huán)境光源
環(huán)境光源也稱為環(huán)境光吐辙,是一種低強(qiáng)度光源宣决,由環(huán)境中所有相鄰表面的反射光產(chǎn)生。在真實(shí)世界中袱讹,物體可以被間接光照(indirect light)
所照亮疲扎。光線通常會(huì)在多個(gè)物體間反射昵时,最后進(jìn)入攝像機(jī)捷雕,在進(jìn)入攝像機(jī)前,可能經(jīng)過了不止一次的物體反射壹甥。利用環(huán)境光可以近似表示場(chǎng)景中某一區(qū)域的大概亮度救巷,而不用對(duì)場(chǎng)景中所有對(duì)象件的間接反射光進(jìn)行復(fù)雜的運(yùn)算。環(huán)境光的計(jì)算非常簡(jiǎn)單句柠,它通常是一個(gè)全局變量浦译。
平行光源
平行光源,也成為無窮遠(yuǎn)光源溯职,是從無窮遠(yuǎn)處發(fā)出的某一方向的光的光源精盅,平行光源特別誰和模擬太陽一類的光,該光源發(fā)出的光線是平行的谜酒。該光源在有限的空中沒有具體的位置叹俏,照射范圍也是無限的,其強(qiáng)度不會(huì)隨著距離的增加而減弱僻族。
點(diǎn)光源
點(diǎn)光源是從空間中一點(diǎn)向各個(gè)方向發(fā)出的等強(qiáng)度的光的光源粘驰。點(diǎn)光源發(fā)出的光的強(qiáng)度與傳播距離成反比自然衰減屡谐。
聚光燈光源
聚光燈光源除了有一個(gè)首選方向之外,其他特點(diǎn)與光源類似蝌数,聚光燈光源發(fā)出的光的強(qiáng)度與傳播距離成反比自然衰減愕掏。
吸收和散射
光線由光源發(fā)射出來后,就會(huì)與一些物體相交顶伞。通常饵撑,相交的結(jié)果有兩個(gè):散射(scattering)
和吸收(absorption)
。
散射只改變光線方向唆貌,但不改變光線的密度和顏色肄梨。而吸收只改變光線的密度和顏色,但不改變光線的方向挠锥。光線在物體表面經(jīng)過散射后众羡,有兩種方向:一種將會(huì)散射到物體內(nèi)部,這種現(xiàn)象被稱為折射(refraction)
和透射(transmission)
蓖租;另一種將會(huì)散射到外部粱侣,這種現(xiàn)象稱為折射(refraction)
。對(duì)于不透明物體蓖宦,折射進(jìn)入物體內(nèi)部的光線還會(huì)繼續(xù)與內(nèi)部的顆粒進(jìn)行相交齐婴,其中一些光線最后會(huì)重新發(fā)射出物體表面,而另一些則被物體吸收稠茂。那些從物體表面重新發(fā)射出的光線將具有和入射光線不同的方向分布和顏色柠偶,如圖:
為了區(qū)分不同的散射方向,我們?cè)俟庹漳P椭惺褂昧瞬煌牟糠謥碛?jì)算它們:高光反射(specular)
部分表示物體表面是如何反射光線的睬关,而漫反射漫反射(diffuse)
部分則表示有多少光線會(huì)被折射诱担、吸收和散射出表面。根據(jù)入射光線的數(shù)量和方向电爹,我們通常使用出射度(exitance)
來描述它蔫仙。輻照度和出射度之間是滿足線性關(guān)系的,二它們之間的比值就是材質(zhì)的漫反射和高光反射屬性丐箩。
著色
著色(shading)
指的是摇邦,根據(jù)材質(zhì)屬性(如漫反射屬性等)、光源信息(如光源方向屎勘、輻照度等)施籍,使用一個(gè)公式去計(jì)算沿某個(gè)觀察方向的出射度的過程。我們也把這個(gè)公式稱之為光照模型(Lighting Model)
不同的光照模型有不同的目的概漱。例如丑慎,一些用于描述粗糙的物體表面,一些用于描述金屬表面等。
光照模型
BRDF光照模型
我們已經(jīng)了解了光線在和物體表面相交時(shí)會(huì)發(fā)生那些現(xiàn)象立哑,當(dāng)已知光源位置和方向夜惭、視角方向,我們就需要知道一個(gè)表面是如何和光照進(jìn)行交互的铛绰。例如诈茧,光線從某個(gè)方向照射到一個(gè)表面時(shí),有多少光線被發(fā)射捂掰?反射的方向有哪些敢会?而BRDF(Bidirectional Reflection Distribution Function)
就是用來回答這些問題的。當(dāng)給定模型表面上的一點(diǎn)時(shí)这嚣,BRDF包含了對(duì)該點(diǎn)外觀的完整的描述鸥昏。在圖形學(xué)中,BRDF大多數(shù)使用一個(gè)數(shù)學(xué)公式來表示姐帚,并且提供了一些參數(shù)來調(diào)整材質(zhì)屬性吏垮。通俗來講,當(dāng)給定入射光線的方向和輻照度后罐旗,BRDF可以給出在某個(gè)出射方向上的光照能量分布膳汪。
標(biāo)準(zhǔn)光照模型
標(biāo)準(zhǔn)光照模型
是對(duì)真實(shí)場(chǎng)景進(jìn)行理想化和簡(jiǎn)化后的模型,也就是說它們并不能真實(shí)地反映無敵和光線之前的交互九秀,是一種經(jīng)驗(yàn)?zāi)P鸵潘浴?biāo)準(zhǔn)光照模型只關(guān)心直接光照(direct light)
,也就是那些直接從光源發(fā)射出來照射到物體表面后鼓蜒,經(jīng)過物體一表面的一次反射直接進(jìn)入攝像機(jī)的光線痹换。
它的基本方法是,把進(jìn)入到攝像機(jī)內(nèi)的光線分為4個(gè)部分都弹,每個(gè)部分使用一種方法計(jì)算它的貢獻(xiàn)度娇豫。這4個(gè)部分是:
1.環(huán)境光(ambient)
這里我們使用來表示,這個(gè)部分用于描述該表面的所有間接光照缔杉。由于環(huán)境光通常是一個(gè)全局變量:
2.自發(fā)光(emissive)
這里我們使用來表示锤躁,這個(gè)部分用于描述給定一個(gè)方向時(shí),一個(gè)表面本身會(huì)想該方向發(fā)射多少輻射量或详。這里我們需要計(jì)算直接由發(fā)光體表面進(jìn)入攝像機(jī)的光線。它的計(jì)算也很簡(jiǎn)單郭计,就直接使用了該材質(zhì)的自發(fā)光顏色:
3.漫反射(diffuse)
這里我們使用來表示霸琴,這個(gè)部分用于描述從光源照射到模型表面時(shí),該表面會(huì)向每個(gè)方向散射多少輻射量昭伸。由于是向各個(gè)方向散射的輻射度,所以在漫反射中,視角的位置是不重要的送爸,應(yīng)為反射是完全隨機(jī)的,因此可以認(rèn)為在任何反射方向上的分布都是一樣的夹供。但是,入射光線的角度很重要仁堪。
蘭伯特光照模型
漫反射符合蘭伯特定律(Lambert's law)
:反射光線的強(qiáng)度與表面法線和光源方向之間夾角的余弦值成正比哮洽。因此漫反射部分的計(jì)算如下:
其中是表面法線,是指向光源的單位矢量弦聂,是材質(zhì)的漫反射顏色鸟辅,是光源顏色和強(qiáng)度。需要注意的是莺葫,我們需要防止法線和光源方向點(diǎn)乘的結(jié)果為負(fù)值匪凉,這樣可以防止物體被從后面來的光源照亮。
半蘭伯特光照模型
蘭伯特光照模型
有一個(gè)問題是捺檬,在光照無法到達(dá)的區(qū)域再层,模型的外光通常是黑的,沒有任何的明暗變化堡纬,這會(huì)使模型的背光區(qū)域看起來就像一個(gè)平面一樣树绩,失去了模型細(xì)節(jié)的表現(xiàn)。為此隐轩,有一種改善技術(shù)被提出來饺饭,這就是半蘭伯特(Half Lambert)光照模型
。Valve公司在開發(fā)游戲《半條命》
時(shí)提出了改善方案职车,在原蘭伯特光照模型上進(jìn)行了一個(gè)簡(jiǎn)單的修改瘫俊,廣義的半蘭伯特光照模型
的公式如下:
絕大多數(shù)情況下、的值都是0.5悴灵,即公式為:
通過這樣的方式扛芽,我們可以把的結(jié)果范圍從映射到,因此模型的背光區(qū)域也可以有敏感變化积瞒,不同的點(diǎn)積結(jié)果會(huì)映射到不同的值上川尖。實(shí)際上半蘭伯特光照模型
沒有任何的物理依據(jù),它僅僅是一個(gè)視覺加強(qiáng)技術(shù)茫孔。
4.高光反射(specular)
Phong光照模型
這里我們使用來表示叮喳,這個(gè)部分用于描述從光源照射到模型表面時(shí),該表面會(huì)在完全鏡面反射方向散射多少輻射量缰贝。這也是一種經(jīng)驗(yàn)?zāi)P外晌颍⒉环险媸鞘澜缰械母吖夥瓷洮F(xiàn)象。它可用于計(jì)算那些沿著完全鏡面反射方向被反射的光線剩晴,這可以讓物體看起來是有光澤的锣咒,例如金屬材質(zhì)侵状。
計(jì)算高光反射需要知道的信息比較多,如表面法線毅整、視角方向趣兄、光源方向、反射方向等悼嫉。在本節(jié)中艇潭,我們假這些矢量都是單位矢量。這四個(gè)矢量中承粤,我們只要知道其中前三個(gè)矢量即可暴区,而第四個(gè)矢量——反射方向可以通過計(jì)算獲得:
是表面法線,是指向光源的矢量辛臊,為反射方向仙粱,根據(jù)圖中可知:
在上的投影為, 則投影的矢量為,則有以下關(guān)系式:
將代入之前的式子可得:
解決了反射方向的計(jì)算彻舰,我們就可以利用Phong
模型來計(jì)算高光反射了伐割,如圖:
公式為:
其中是材質(zhì)的光澤度(gloss)
,也被稱為反光度(shininess)
刃唤。它用于控制高光區(qū)域的“亮點(diǎn)”有多寬隔心,約大,亮點(diǎn)就越小尚胞。是材質(zhì)的高光反射顏色硬霍,它用于控制改材質(zhì)對(duì)于高光反射的強(qiáng)度和顏色。是光源顏色和強(qiáng)度
Blinn-Phong光照模型
Phong光照模型
能夠很好的表現(xiàn)高光效果笼裳,不過Phong光照模型
的缺點(diǎn)就是計(jì)算量較大唯卖。針對(duì)這個(gè)問題,Blinn
提出了一個(gè)簡(jiǎn)單的修改方法來得到類似的效果躬柬。它的基本思想是拜轨,避免計(jì)算反射方向,為此允青,Blinn-Phong光照模型
引入了一個(gè)新的矢量橄碾,它是通過對(duì)和的取平均后在歸一化得到的。即:
然后使用和之間的夾角進(jìn)行計(jì)算颠锉,而非和之間的夾角法牲,如圖:
公式為:
在一般情況下,Blinn-Phong光照模型
效率會(huì)更高木柬。
著色模型
有了上面的基本光照模型的計(jì)算公式皆串,那么我們?cè)谀睦镉?jì)算這些光照模型呢?通常來講我們有以下兩種:
逐頂點(diǎn)光照(per-vertex lighting)
逐頂點(diǎn)光照(per-vertex lighting)
也被稱為高洛德著色(Gouraud shading)
眉枕。在逐頂點(diǎn)光照(per-vertex lighting)
中,我們?cè)诿總€(gè)頂點(diǎn)上計(jì)算光照,然后會(huì)在渲染圖元內(nèi)部進(jìn)行線性插值速挑,最后輸出成像素顏色谤牡。由于頂點(diǎn)數(shù)目往往遠(yuǎn)遠(yuǎn)小于像素?cái)?shù)目,因此計(jì)算量往往要小于逐像素光照(per-pixel lighting)
姥宝。但是翅萤,由于逐頂點(diǎn)光照(per-vertex lighting)
依賴于線性插值來得到像素光照,因此腊满,當(dāng)光照模型中有非線性的計(jì)算(例如計(jì)算高光反射(specular)
)時(shí)套么,逐頂點(diǎn)光照就會(huì)出問題,由于逐頂點(diǎn)光照(per-vertex lighting)
會(huì)在渲染圖元內(nèi)部對(duì)頂點(diǎn)顏色進(jìn)行插值碳蛋,這會(huì)倒是渲染圖元內(nèi)部的顏色總是暗于頂點(diǎn)處的最高顏色值胚泌,這在某些情況下會(huì)產(chǎn)生明顯的棱角現(xiàn)象。
逐像素光照(per-pixel lighting)
逐像素光照(per-pixel lighting)
也被稱為Phong著色(Phong shading)
肃弟,在逐像素光照(per-pixel lighting)
中玷室,會(huì)以每個(gè)像素為基礎(chǔ)得到它的法線(可以是對(duì)頂點(diǎn)法線插值得到的,也可以是從法線紋理中采樣得到的)笤受,然后進(jìn)行光照模型的計(jì)算穷缤。與之前提到的Phong光照模型
不同,這種在面片之間對(duì)頂點(diǎn)法線插值的技術(shù)稱為逐像素光照(per-pixel lighting)
或者Phong著色(Phong shading)
箩兽。
本節(jié)教程就到此結(jié)束,希望大家繼續(xù)閱讀我之后的教程津肛。
謝謝大家,再見!
飲水思源
參考文獻(xiàn):
《3D游戲與圖形學(xué)中的數(shù)學(xué)方法》
《Unity Shader 入門精要》
版權(quán)聲明:原創(chuàng)技術(shù)文章,撰寫不易汗贫,轉(zhuǎn)載請(qǐng)注明出處身坐!