3D數(shù)學(xué)-基礎(chǔ)光照

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)仇祭,用l來表示他的方向。那么颈畸,我們?nèi)绾螠y(cè)量一個(gè)光源發(fā)射出了多少光呢乌奇?也就是說没讲,我們?nèi)绾瘟炕饽兀吭诠鈱W(xué)里礁苗,我們通常用輻照度(irradiance)來量化光爬凑。對(duì)于平行光來說,它的輻照度可通過計(jì)算在垂直于l的單位面積上單位時(shí)間內(nèi)穿過的能量來得到试伙。在計(jì)算光照模型時(shí)嘁信,我們需要知道一個(gè)物體表面的輻照度,而物體表面往往時(shí)和l不垂直的疏叨,那么如何計(jì)算這樣的表面的輻照度呢潘靖?我們可以使用光源方向l和表面法線n之間的夾角的余弦值來得到。需要注意的是蚤蔓,這里默認(rèn)方向矢量的模都為1卦溢。

3D數(shù)學(xué)-基礎(chǔ)光照_1.png

由上圖可知輻照度是和照射到物體表面時(shí)光線之間的距離d/\cos\theta成反比的,因此輻照度就和\cos\theta成正比秀又。\cos\theta可以用光源方向l和表面法線n點(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ā)射出的光線將具有和入射光線不同的方向分布和顏色柠偶,如圖:

3D數(shù)學(xué)-基礎(chǔ)光照_2.png

為了區(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)

這里我們使用c_{ambient}來表示,這個(gè)部分用于描述該表面的所有間接光照缔杉。由于環(huán)境光通常是一個(gè)全局變量:

c_{ambient}=g_{ambient}

2.自發(fā)光(emissive)

這里我們使用c_{emissive}來表示锤躁,這個(gè)部分用于描述給定一個(gè)方向時(shí),一個(gè)表面本身會(huì)想該方向發(fā)射多少輻射量或详。這里我們需要計(jì)算直接由發(fā)光體表面進(jìn)入攝像機(jī)的光線。它的計(jì)算也很簡(jiǎn)單郭计,就直接使用了該材質(zhì)的自發(fā)光顏色:

c_{emissive}=m_{emissive}

3.漫反射(diffuse)

這里我們使用c_{diffuse}來表示霸琴,這個(gè)部分用于描述從光源照射到模型表面時(shí),該表面會(huì)向每個(gè)方向散射多少輻射量昭伸。由于是向各個(gè)方向散射的輻射度,所以在漫反射中,視角的位置是不重要的送爸,應(yīng)為反射是完全隨機(jī)的,因此可以認(rèn)為在任何反射方向上的分布都是一樣的夹供。但是,入射光線的角度很重要仁堪。

蘭伯特光照模型

漫反射符合蘭伯特定律(Lambert's law):反射光線的強(qiáng)度與表面法線和光源方向之間夾角的余弦值成正比哮洽。因此漫反射部分的計(jì)算如下:

c_{diffuse}=(c_{light} \cdot m_{diffuse}) \cdot max(0, n \cdot l)

其中n是表面法線,l是指向光源的單位矢量弦聂,m_{diffuse}是材質(zhì)的漫反射顏色鸟辅,c_{light}是光源顏色和強(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)單的修改瘫俊,廣義的半蘭伯特光照模型的公式如下:

c_{diffuse}=(c_{light} \cdot m_{diffuse})( \alpha (n \cdot l) + \beta )

絕大多數(shù)情況下\alpha\beta的值都是0.5悴灵,即公式為:

c_{diffuse}=(c_{light} \cdot m_{diffuse})(0.5*(n \cdot l)+0.5)

通過這樣的方式扛芽,我們可以把n \cdot l的結(jié)果范圍從\left [ -1,1 \right ]映射到\left [ 0,1 \right ],因此模型的背光區(qū)域也可以有敏感變化积瞒,不同的點(diǎn)積結(jié)果會(huì)映射到不同的值上川尖。實(shí)際上半蘭伯特光照模型沒有任何的物理依據(jù),它僅僅是一個(gè)視覺加強(qiáng)技術(shù)茫孔。

4.高光反射(specular)

Phong光照模型

這里我們使用c_{specular}來表示叮喳,這個(gè)部分用于描述從光源照射到模型表面時(shí),該表面會(huì)在完全鏡面反射方向散射多少輻射量缰贝。這也是一種經(jīng)驗(yàn)?zāi)P外晌颍⒉环险媸鞘澜缰械母吖夥瓷洮F(xiàn)象。它可用于計(jì)算那些沿著完全鏡面反射方向被反射的光線剩晴,這可以讓物體看起來是有光澤的锣咒,例如金屬材質(zhì)侵状。

計(jì)算高光反射需要知道的信息比較多,如表面法線毅整、視角方向趣兄、光源方向、反射方向等悼嫉。在本節(jié)中艇潭,我們假這些矢量都是單位矢量。這四個(gè)矢量中承粤,我們只要知道其中前三個(gè)矢量即可暴区,而第四個(gè)矢量——反射方向可以通過計(jì)算獲得:

3D數(shù)學(xué)-基礎(chǔ)光照_3.png

N是表面法線,L是指向光源的矢量辛臊,R為反射方向仙粱,根據(jù)圖中可知:

L - R = X

LN上的投影為N \cdot L, 則投影的矢量為(N \cdot L)N,則有以下關(guān)系式:

X = 2(L-(N \cdot L)N)

X代入之前的式子可得:

R = L - X = L - 2(L-(N \cdot L)N) = 2(N \cdot L)N - L

解決了反射方向的計(jì)算彻舰,我們就可以利用Phong模型來計(jì)算高光反射了伐割,如圖:

3D數(shù)學(xué)-基礎(chǔ)光照_4.png

公式為:

c_{specular}=(c_{light} \cdot m_{specular}) \cdot max(0, v \cdot r)^{m_{gloss}}
其中m_{gloss}是材質(zhì)的光澤度(gloss),也被稱為反光度(shininess)刃唤。它用于控制高光區(qū)域的“亮點(diǎn)”有多寬隔心,m_{gloss}約大,亮點(diǎn)就越小尚胞。m_{specular}是材質(zhì)的高光反射顏色硬霍,它用于控制改材質(zhì)對(duì)于高光反射的強(qiáng)度和顏色。c_{light}是光源顏色和強(qiáng)度

Blinn-Phong光照模型

Phong光照模型能夠很好的表現(xiàn)高光效果笼裳,不過Phong光照模型的缺點(diǎn)就是計(jì)算量較大唯卖。針對(duì)這個(gè)問題,Blinn提出了一個(gè)簡(jiǎn)單的修改方法來得到類似的效果躬柬。它的基本思想是拜轨,避免計(jì)算反射方向r,為此允青,Blinn-Phong光照模型引入了一個(gè)新的矢量h橄碾,它是通過對(duì)vl的取平均后在歸一化得到的。即:

h = \frac{v+l}{\vert v+l \vert}

然后使用nh之間的夾角進(jìn)行計(jì)算颠锉,而非vr之間的夾角法牲,如圖:

3D數(shù)學(xué)-基礎(chǔ)光照_5.png

公式為:

c_{specular}=(c_{light} \cdot m_{specular}) \cdot max(0, n \cdot h)^{m_{gloss}}

在一般情況下,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)注明出處身坐!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芳绩,隨后出現(xiàn)的幾起案子掀亥,更是在濱河造成了極大的恐慌,老刑警劉巖妥色,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搪花,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嘹害,警方通過查閱死者的電腦和手機(jī)撮竿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笔呀,“玉大人幢踏,你說我怎么就攤上這事⌒硎Γ” “怎么了房蝉?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵僚匆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我搭幻,道長(zhǎng)咧擂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任檀蹋,我火速辦了婚禮松申,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俯逾。我一直安慰自己贸桶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布桌肴。 她就那樣靜靜地躺著皇筛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪识脆。 梳的紋絲不亂的頭發(fā)上设联,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音灼捂,去河邊找鬼离例。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悉稠,可吹牛的內(nèi)容都是我干的宫蛆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼的猛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼耀盗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卦尊,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤叛拷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后岂却,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忿薇,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年躏哩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了署浩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扫尺,死狀恐怖筋栋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情正驻,我是刑警寧澤弊攘,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布抢腐,位于F島的核電站,受9級(jí)特大地震影響肴颊,放射性物質(zhì)發(fā)生泄漏氓栈。R本人自食惡果不足惜渣磷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一婿着、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧醋界,春花似錦竟宋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逐样,卻和暖如春蜗字,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脂新。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工挪捕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人争便。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓级零,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親滞乙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奏纪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345