【LearnOpenGL】【P11】創(chuàng)建多種類(lèi)型的光源

0 上一章節(jié)我們創(chuàng)建了一個(gè)黑客帝國(guó)風(fēng)格的材質(zhì)效果。本章節(jié)我們將把光源的種類(lèi)進(jìn)行擴(kuò)充。
(1)定向光實(shí)現(xiàn)。
(2)點(diǎn)光源實(shí)現(xiàn)。
(3)聚光實(shí)現(xiàn)。
(4)將不同種類(lèi)的投光物進(jìn)行抽象。

?1 定向光實(shí)現(xiàn)。
1.0由于定向光的光照方向不會(huì)隨著光源位置的移動(dòng)而發(fā)生變化,所以光源屬性里不需要光源的位置,只需要光源的方向即可。


1.1 設(shè)置好定向光的方向向量,編譯運(yùn)行程序可得到固定光照方向的場(chǎng)景。



2 點(diǎn)光源實(shí)現(xiàn)。
2.0 點(diǎn)光源的光源方向根據(jù)光源的位置確定。點(diǎn)光源的重點(diǎn)在于從該光源發(fā)出的光照強(qiáng)度會(huì)隨著光源到著色片段的距離增加而逐漸減弱。光源離片段越近光越亮,離的越遠(yuǎn)光越暗。具體的衰減關(guān)系如下所示:


2.1 我們根據(jù)點(diǎn)光源的衰減公式,設(shè)置好點(diǎn)光源的光照屬性,并使用這些衰弱參數(shù)實(shí)現(xiàn)光照衰弱公式計(jì)算出光線(xiàn)的衰減系數(shù),將衰減系數(shù)乘以Phong光照模型參數(shù)便是點(diǎn)光源的光照模型。


2.2 點(diǎn)光源的衰減系數(shù)一般情況下可按下表進(jìn)行經(jīng)驗(yàn)值設(shè)置。


2.3 編譯運(yùn)行程序,可得到點(diǎn)光源的渲染場(chǎng)景。此時(shí)可以看到由于點(diǎn)光源距離被照物體較遠(yuǎn),所以整個(gè)場(chǎng)景看起來(lái)很暗。


?
3 聚光實(shí)現(xiàn)。
3.0 聚光的原理關(guān)鍵在于需要預(yù)先設(shè)置好光錐的切光角度,根據(jù)著色片段與光源的位置來(lái)判斷該著色片段是否處于光錐范圍之內(nèi)。如果在光錐范圍內(nèi)則進(jìn)行著色,如果不在光錐范圍內(nèi)則只對(duì)該片段進(jìn)行環(huán)境光的渲染。



3.1 編譯運(yùn)行程序后可看到聚光源的效果,這個(gè)效果就像手電筒的一束光照射在箱子上一樣。但是此時(shí)光錐邊緣的片段光照過(guò)渡非常生硬,在光錐之內(nèi)的片段很亮,在光錐之外的片段就直接黑掉了。

3.2 為了解決光錐邊緣光線(xiàn)過(guò)渡生硬的問(wèn)題,我們需要引入內(nèi)外光錐的概念。此時(shí)如著色片段在內(nèi)光錐之內(nèi)則會(huì)很亮。如著色片段在內(nèi)光錐與外光錐之間則會(huì)根據(jù)位置進(jìn)行插值計(jì)算,光照強(qiáng)度由內(nèi)至外會(huì)逐漸減少。當(dāng)著色片段位于外光錐之外時(shí),則只進(jìn)行環(huán)境光渲染。



3.3 編譯運(yùn)行程序可得到一個(gè)光錐邊緣被過(guò)渡的場(chǎng)景。此時(shí)的場(chǎng)景是不是很有恐怖片里主角拿著手電筒去鬼屋場(chǎng)景探索的氛圍?


?
4 將不同種類(lèi)的投光物進(jìn)行抽象。
4.0 我們已經(jīng)將三種不同類(lèi)型的投光物給實(shí)現(xiàn)了一遍,現(xiàn)在我們需要將其抽象整理出來(lái)。首先我們需要把三種投光物的光照屬性參數(shù)抽象成對(duì)應(yīng)的光照屬性數(shù)據(jù)結(jié)構(gòu)。

4.1 定義好投光物的光照屬性數(shù)據(jù)結(jié)構(gòu)之后,我們需要使用這些數(shù)據(jù)結(jié)構(gòu)來(lái)生成投光物的對(duì)象。(其中點(diǎn)光源對(duì)象是一個(gè)數(shù)組,意味著我們可以在場(chǎng)景中設(shè)置多個(gè)點(diǎn)光源)

4.2 定義三種投光物各自對(duì)應(yīng)的光照計(jì)算函數(shù)接口。

4.3 此時(shí)的Phong著色模型將被抽象為三種投光物的著色信息之和。

4.4 我們?cè)趫?chǎng)景中設(shè)置好多個(gè)點(diǎn)光源的位置,并按順序繪制點(diǎn)光源模型。


4.5 按照三種投光物的光照屬性,設(shè)置好對(duì)應(yīng)的光照信息。

4.6 編譯運(yùn)行程序,我們即可得到多種投光物共同作用的光照?qǐng)鼍啊?br>

4.7 我們還可以再玩點(diǎn)花的。通過(guò)調(diào)整背景顏色,以及三種投光物的顏色屬性可創(chuàng)造出風(fēng)格各異的渲染場(chǎng)景。


