在三維圖形程序中使用光照效果能夠有效地增強(qiáng)場(chǎng)景的真實(shí)感。在Direct3D中,通過計(jì)算場(chǎng)景中的光線和物體表面材質(zhì)反射光線顏色的數(shù)學(xué)交互,可使光線模型接近于真實(shí)世界的照明系統(tǒng)。
光照計(jì)算模型
在真實(shí)世界中,光線在到達(dá)眼睛之前經(jīng)過了物體表面的多次反射,每次反射時(shí),物體表面都會(huì)吸收一些光,有些被隨機(jī)反射擴(kuò)散出去,其余的到達(dá)下一個(gè)物體的表面或眼睛。真實(shí)世界中光線反射的效果就是光線跟蹤算法需要模擬實(shí)現(xiàn)的。盡管光線跟蹤算法能夠創(chuàng)建非常逼真的與自然界中觀察到極為相似的景象,但是還沒有實(shí)時(shí)程序能夠完成這些運(yùn)算。考慮到實(shí)時(shí)渲染的需要,Direct3D使用更簡(jiǎn)單的方法進(jìn)行光照計(jì)算。Direct3D光照計(jì)算模型包括4種:環(huán)境光、漫反射光、鏡面反射光和自發(fā)光。它們的結(jié)合能靈活高效地解決三維圖形程序中的光照問題。
1、環(huán)境光
一個(gè)物體即使沒有直接被光源照射,但只要有光線通過其他物體的折射、反射到達(dá)該物體,它也能被看見。在基本光照模型中,可以在一個(gè)場(chǎng)景中設(shè)置一個(gè)基準(zhǔn)光亮度,可簡(jiǎn)單地模擬一種從不同物體表面所產(chǎn)生的反射光的統(tǒng)一照明,稱為環(huán)境光(ambient
light)或背景光。環(huán)境光沒有位置或方向上的特征,只有一個(gè)顏色亮度值,而且不會(huì)衰減,所以在所有方向和所有物體表面上投射的環(huán)境光的數(shù)量是恒定不變的。
在Direct3D中可以通過設(shè)置渲染狀態(tài)為整個(gè)場(chǎng)景添加環(huán)境光。方法很簡(jiǎn)單,具體的代碼如下:
g_device->SetRenderState(D3DRS_AMBIENT,
D3DCOLOR_X#404040);
2、漫反射
漫反射在現(xiàn)實(shí)生活中最為普遍,太陽的直射、日光燈的照射都可以用漫反射光照模型來近似。不同于環(huán)境光,漫反射光的空間位置和方向?qū)ξ矬w的照明有很大的影響。圖形系統(tǒng)中物體表面頂點(diǎn)P的漫反射顏色值Idiffuse的計(jì)算公式為:
Idiffuse = k * Ilight * cosθ
其中k為物體表面材質(zhì)的反射系數(shù),Ilight為燈光顏色,θ為物體表面頂點(diǎn)指向光源位置的方向向量L和頂點(diǎn)法線N之間的夾角。如果L和N為單位向量,由幾何知識(shí)可知,cosθ等于L和N的點(diǎn)積,所以Idiffuse的計(jì)算公式可變?yōu)椋?/p>
Idifffuse = k * Ilight * (L . N)
在Direct3D圖形系統(tǒng)中,物體表面頂點(diǎn)處的漫反射顏色值就是利用上式計(jì)算的,需要說明的是,在Direct3D中顏色值是由紅、綠、藍(lán)三個(gè)顏色分量表示,在具體計(jì)算時(shí)也是按照三個(gè)分量分別計(jì)算。
3、鏡面反射
當(dāng)觀察金屬物品或玻璃制品的表面時(shí),改變觀察點(diǎn)的位置,可以發(fā)現(xiàn)玻璃杯表面的亮度也在發(fā)生變化,這種現(xiàn)象往往發(fā)生在光滑物體表面,稱之為鏡面反射。物體表面頂點(diǎn)的鏡面反射顏色值的計(jì)算方法由下圖所示:

設(shè)物體表面頂點(diǎn)指向觀察點(diǎn)的單位向量為V,反射光線為R,R和V之間的夾角為θ,頂點(diǎn)P的鏡面反射顏色值可由下式近似計(jì)算:
Ispecular = Ks * Ilight * (cosθ)n
= Ks * Ilight * (V . R)n
其中,Ks和n為物體表面材質(zhì)的鏡面反射系數(shù)。
從上面的計(jì)算公式中不難看出,鏡面反射的計(jì)算量比較大,因此在默認(rèn)狀態(tài)下,Direct3D不對(duì)物體進(jìn)行鏡面反射計(jì)算,如果要激活Direct3D鏡面反射光照計(jì)算,需要設(shè)置相關(guān)的渲染狀態(tài),代碼如下:
g_device->SetRenderState(D3DRS_SPECULARENABLE, TRUE);
4、自發(fā)光
自發(fā)光是指對(duì)象自己發(fā)出的光。自發(fā)光其實(shí)就是通過對(duì)象的自發(fā)光材質(zhì)實(shí)現(xiàn)的。用結(jié)構(gòu)D3DMATERIAL9的成員Emissive描述自發(fā)光的顏色和透明度。自發(fā)光可以影響一個(gè)對(duì)象的顏色,例如通過設(shè)置灰暗材質(zhì)的自發(fā)光顏色屬性可以使其變得明亮一點(diǎn)。可以使用材質(zhì)的自發(fā)光屬性實(shí)現(xiàn)發(fā)光的對(duì)象,而不用在場(chǎng)景內(nèi)添加燈光,從而縮小了計(jì)算量。例如,可以通過具有藍(lán)色自發(fā)光屬性的材質(zhì)實(shí)現(xiàn)一塊藍(lán)色水晶,而不在場(chǎng)景內(nèi)添加其他燈光。
用自發(fā)光屬性創(chuàng)建的材質(zhì)并不發(fā)射出能被場(chǎng)景內(nèi)其他對(duì)象反射的光,也就是說,它發(fā)出的光不參與光運(yùn)算。為了實(shí)現(xiàn)反射光,必須在場(chǎng)景內(nèi)添加額外的燈光。
5、對(duì)光照計(jì)算模型的說明
環(huán)境光所實(shí)現(xiàn)的實(shí)際上是一個(gè)定值,沒有方向?qū)傩裕运刮矬w對(duì)象的所有像素都呈現(xiàn)同樣的顏色。它能很快完成計(jì)算,但這時(shí)的物體看上去不真實(shí)。
漫反射由光的方向和物體表面的法向量決定。如果改變了光的方向或者物體表面的法向量,物體表面的漫反射值就發(fā)生變化。因?yàn)槊總€(gè)物體頂點(diǎn)都不相同,所以它的計(jì)算時(shí)間會(huì)較長(zhǎng),使用這種光照計(jì)算模型的優(yōu)點(diǎn)在于用它渲染物體時(shí)能夠體現(xiàn)出物體的三維深度。
鏡面反射發(fā)生在光滑物體表面,它比漫反射光更強(qiáng)烈并沿著對(duì)象表面迅速衰減,它的計(jì)算時(shí)間比漫反射更長(zhǎng),但優(yōu)點(diǎn)在于它為表面添加了重要的細(xì)節(jié)。
現(xiàn)實(shí)中的光照效果可以通過這些光照類型進(jìn)行近似模擬。通過選擇合適的光照計(jì)算模型,能使最終顯示的圖形具有逼近真實(shí)世界景物的真實(shí)感,同時(shí)保持圖形程序的執(zhí)行效率。在圖形程序中對(duì)物體頂點(diǎn)進(jìn)行光照計(jì)算時(shí),具體采用哪種或哪幾種光照計(jì)算模型,是由物體表面材質(zhì)決定的。這也和實(shí)際情況比較吻合,如果物體表面粗糙,則當(dāng)光線照射到物體上時(shí),發(fā)生漫反射;如果物體表面很光滑,光線照射到物體上時(shí)將發(fā)生鏡面反射。
環(huán)境光、自發(fā)光、漫反射光的計(jì)算結(jié)果作為頂點(diǎn)的漫反射顏色輸出,鏡面反射光的計(jì)算結(jié)果作為頂點(diǎn)的鏡面反射光顏色輸出。