LearnOpenGL-P9 創(chuàng)建Phong模型基礎(chǔ)光照

0 上一章我們創(chuàng)建了一個FPS游戲風(fēng)格的鏡頭調(diào)度。本期我們將根據(jù)Phong光照模型進(jìn)行光照系統(tǒng)的模擬。
(1)創(chuàng)建光源和被光照射的物體。
(2)根據(jù)Phong模型進(jìn)行光照系統(tǒng)的模擬。?

1 創(chuàng)建光源和被光照射的物體。
1.0 我們讓光源和被照對象共用一個VBO,使用同一個VBO中立方體頂點坐標(biāo)進(jìn)行圖形繪制。把光源的VAO和被照對象的VAO分開設(shè)置。

1.1 創(chuàng)建兩個著色器程序,一個是被照對象的著色器一個是光源的著色器。其中頂點著色器源碼公用。光源的片段著色器源碼將光源顏色設(shè)置為白色(即RGBA值均為1.0)。被照對象的顏色設(shè)置為對象自身顏色乘以光照顏色。




1.2 激活被照對象著色器程序,并設(shè)置好被照對象的顏色和光照的顏色。計算10個被照對象的MVP矩陣。激活被照對象的VAO,繪制被照對象實體。

1.3 確定光源在世界坐標(biāo)系中的位置。激活光源著色器,設(shè)置好光源的MVP矩陣。綁定光源的VAO并繪制光源實體。


1.4 編譯運行程序可得光源(白色)和10個被照對象(珊瑚色)。


2 根據(jù)Phong模型進(jìn)行光照系統(tǒng)的模擬。
2.0 首先我們使用vertices數(shù)組傳入頂點坐標(biāo)的同時還要再傳入每個頂點坐標(biāo)的法向量。一個立方體有6個面,意味著頂點坐標(biāo)的法向量有6種,分別指向立方體局部坐標(biāo)系軸的6個方向。

2.1 將使用模型矩陣將頂點坐標(biāo)從局部坐標(biāo)系轉(zhuǎn)到世界坐標(biāo)系中供片段著色器使用。除了計算頂點之外,我們還需要使用法線矩陣將頂點法向量也轉(zhuǎn)到世界坐標(biāo)系中供片段著色器使用。

2.2 根據(jù)Phong模型的理論,我們將被照物體的光線信息拆分為三個部分:環(huán)境光(Ambient Lighting)、漫反射光(Diffuse Lighting)和鏡面光照(Specular Lighting)。光源的光會根據(jù)這三個途徑對物體產(chǎn)生相應(yīng)的作用。三種光照RGB向量之和再乘以被照物體本身的RGB顏色向量即為通過Phong得到的光照信息。
(1)環(huán)境光照方面,我們設(shè)置了一個環(huán)境光強度系數(shù)用其影響環(huán)境光的強度。
(2)漫反射光方面,主要是要計算光源距離片段坐標(biāo)的向量方向與片段自己的法向量之間的角度,角度越小,影響越大。
(3)鏡面光照方面,我們主要是要考慮光源通過物體表面產(chǎn)生的反射光與觀察者位置之間的關(guān)系,觀察方向與反射光線的夾角越小,說明反射的光線強度越大。


2.3 我們可以讓光源的位置有規(guī)律的移動起來。

2.4 激活光源著色器,傳入光源的相關(guān)信息,再綁定光源的VAO對象即可繪制光源。

2.5 激活被照對象著色器,將被照對象的相關(guān)信息傳入,綁定被照對象的VAO。再繪制每一個被照對象時,記得要把對象相應(yīng)的法線矩陣傳進(jìn)去。


2.6 編譯運行對象,可得到10個被照物體正對著光源,光源有規(guī)律的運動著。被照物體上的光線和顏色渲染會隨著光源的移動而產(chǎn)生變化。此效果模擬現(xiàn)實中的光照現(xiàn)象。

2.7 我們也可以把光源固定住,讓被照對象自己動起來。此時我們可以看到朝著光源的面更亮,背對光源的面更暗。


