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

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