OpenGL_16_鏡面反射-創(chuàng)新互聯(lián)

1,
我們?cè)谟?jì)算環(huán)境光的時(shí)候,光的強(qiáng)度是唯一的影響因素。然后處理漫射光的時(shí)候公式中加入了光的方向參數(shù)。
鏡面反射包含了上面所有的綜合因素并且添加了一個(gè)新的元素:觀察者的位置。
鏡面反射時(shí)光以一定角度照射到物體表面,同時(shí)會(huì)在法線的另一側(cè)對(duì)稱的角度上反射出去,如果觀察者剛好在反射光線的路徑上那么就會(huì)看到格外強(qiáng)烈的光線。

鏡面反射最終的結(jié)果是物體在從某個(gè)角度看上去會(huì)十分明亮,而移動(dòng)開后這個(gè)光亮又會(huì)消失?,F(xiàn)實(shí)中好的鏡面反射的例子是金屬物體,這些物體有時(shí)候看上去由于太亮了導(dǎo)致看不到他本來的顏色而是直接照向你眼睛的白色的亮光。但這種屬性在其他的一些材料上是沒有的(比如:木頭)。很多東西根本不會(huì)發(fā)光,不管光源從什么角度照射以及觀察者在什么位置。所以,鏡面反射光的存在更取決于反射物體的材料性質(zhì)而不是光源本身。


'I' 是入射光
'N' 是表面法線
'R' 反射光,和入射光'I'關(guān)于法線對(duì)稱,但方向相反
'V' 是從入射光和反射光交點(diǎn)處(入射點(diǎn))到觀察者眼睛的向量,表示觀察者視線
'α' 反射光'R'和觀察者視線'V'的夾角

我們將使用夾角'α'來對(duì)鏡面反射光現(xiàn)象進(jìn)行建模。有一點(diǎn)可以看出當(dāng)觀察者視線和反射光重合時(shí)(夾角為0),反射光的強(qiáng)度大。觀察者慢慢從反射光'R'移開時(shí),夾角慢慢變大,而我們希望隨著角度增大反射光要慢慢衰弱。明顯,這里又要使用差積運(yùn)算來計(jì)算夾角'α'的余弦值了,這個(gè)值將作為計(jì)算鏡面反射光公式的反射參數(shù)。當(dāng)'α'為0時(shí)余弦值為1,這是我們反射參數(shù)的大值。隨著夾角'α'增大余弦值慢慢減小,直到夾角達(dá)到90度時(shí)就徹底沒有鏡面反射的效果了。當(dāng)然,夾角大于90度時(shí)余弦值為負(fù),也沒有任何反射效果,也就是觀察者不在反射光的路徑范圍內(nèi)。

我們要用到'R'和'V'來計(jì)算夾角'α'。'V'可以通過世界坐標(biāo)系中觀察者位置和光的入射點(diǎn)位置的差計(jì)算得到。camera已經(jīng)在世界空間進(jìn)行維護(hù)了,我們只需要將它的位置傳給shader著色器。
另外上面的圖是經(jīng)過簡(jiǎn)化了的模型,光在物體表面只有一個(gè)入射點(diǎn)(事實(shí)上不是,這里只是為了好分析)。
事實(shí)上,整個(gè)三角形都被點(diǎn)亮了(假設(shè)它面向光源),因此我們要計(jì)算每一個(gè)像素的鏡面反射效果(和漫反射光的計(jì)算一樣)。
我們必須要知道每個(gè)像素在世界空間的位置,這個(gè)不難:可以將頂點(diǎn)變換到世界空間,讓光柵器對(duì)像素的世界空間位置進(jìn)行插值并將結(jié)果傳給片段著色器。事實(shí)上,這個(gè)和之前教程中對(duì)法線的處理操作是一樣的。
最后是要使用'I'向量(由應(yīng)用傳給shader)來計(jì)算反射光線'R'。如下圖:

首先要強(qiáng)調(diào)向量沒有起點(diǎn)的概念,所有方向相同且長(zhǎng)度相同的向量都是同一個(gè)向量。
因此,圖中將入射光向量'I'復(fù)制到表面下面位置向量本身是不變的。
目標(biāo)是求向量'R',根據(jù)向量的加法,'R'等于'I'+'V'。

'I'是已知的,所以我們要求'V'。
注意法線'N'的反向向量為'-N', 計(jì)算'I'和'-N'的點(diǎn)積可以得到'I'在'-N'上的投影,這也是'V'的模長(zhǎng)度的一半。
另外'V'和'N'的方向是相同的,所以只要用計(jì)算的那個(gè)投影長(zhǎng)度乘以單位向量'N'再乘以2就是向量'V'了。

GLSL提供了一個(gè)叫做'reflect'的內(nèi)部函數(shù)就是做的上面這個(gè)計(jì)算??梢钥聪旅孢@個(gè)函數(shù)在shader中的用法。這里得出計(jì)算鏡面反射的最終公式:

開始先是將光的顏色和物體表面的顏色相乘,這個(gè)和在計(jì)算環(huán)境光以及漫反射光時(shí)一樣。得到的結(jié)果再和材料的鏡面反射強(qiáng)度參數(shù)('M')相乘。如果材料沒有反射性能,比如木頭,那么鏡面反射參數(shù)就為0,整個(gè)公式的結(jié)果也就為0了,而像金屬這種發(fā)光材料鏡面反射能力就會(huì)很強(qiáng)。之后再乘以光線和觀察者視線夾角的余弦值,這也是最后一個(gè)調(diào)整鏡面反射光強(qiáng)度的參數(shù)('鏡面參數(shù)'或者叫做'發(fā)光參數(shù)')。

這三個(gè)參數(shù)都是獨(dú)立于光線本身的,因?yàn)楫?dāng)同一束光照到不同的材料上(比如:木頭和金屬)時(shí)會(huì)有不同的反射發(fā)光效果。
目前對(duì)材料屬性的使用模型還是很局限的,同一個(gè)繪制回調(diào)的所有三角形會(huì)得到這些屬性的一樣的值。如果同一個(gè)模型的不同部分的三角形圖元是不同的材料,這樣就不合理了。在后面的教程中講關(guān)于mesh網(wǎng)格的加載時(shí)我們會(huì)在一個(gè)模塊中產(chǎn)生不同的鏡面參數(shù)值并作為頂點(diǎn)緩沖器的一部分(而不是shader的一個(gè)參數(shù)),這樣我們就可以在同一個(gè)繪制回調(diào)中使用不同的鏡面光照參數(shù)來處理三角形圖元。

2,

上面頂點(diǎn)著色器多了最后一行代碼,世界變換矩陣(之前用來變換法線的那個(gè)世界變換矩陣)這里用來將頂點(diǎn)的世界坐標(biāo)傳給片段著色器。



為市中等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及市中網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、市中網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

網(wǎng)頁(yè)名稱:OpenGL_16_鏡面反射-創(chuàng)新互聯(lián)
分享URL:http://muchs.cn/article32/pgdsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、電子商務(wù)、標(biāo)簽優(yōu)化、定制網(wǎng)站、小程序開發(fā)營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司