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

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