光照(light)是爲了加強遊戲場景的真實感而存在,也有助於描述實體形狀和立體感,算是3D遊戲中渲染的基礎了。spa
如:.net
在Direct3D的光照模型中,光源發出的光由如下三種類型組成(和現實生活中的相似)。3d
一、環境光(Ambient light):這種光經其餘表面反射到達物體表面,並照亮整個場景。如現實生活中的樹葉同樣,只被環境光必定程度的照亮,而不是直接照射,之因此呈現 出綠色,那是由於它對綠色光產生了反射。code
二、漫射光(Diffuse Light):這種光沿着特定的方向傳播。當它到達某一個表面時,將沿着各個方向均勻反射,即不管從什麼角度看,該表面的亮度均相同。blog
三、鏡面光(Specular Light):這種光和上面的漫射光(Diffuse Light)相似,都是沿着特定的方向傳播,不過鏡面光(Specular Light)到達物體的表面時,只沿着另一個方 向反射,從而造成只能在必定範圍內才能觀測到的高亮度照射。遊戲
Tip:ip
鏡面光和另外兩種光比較起來,計算量要大得多,因此選擇時應該權衡下。get
在Direct3D中,每種類型的光均可以用D3DCOLORVALUE或D3DXCOLOR來表示。it
這兩個的結構基本一致:io
//D3DXCOLOR Structure typedef struct D3DXCOLOR { FLOAT R; FLOAT G; FLOAT B; FLOAT A; }D3DXCOLOR,*LPD3DXCOLOR;
//D3DCOLORVALUE structure
typedef struct D3DCOLORVALUE { float r; float g; float b; float a; }D3DCOLORVALUE,*LPD3DCOLORVALUE;
結構體中的前三個R,G,B也就是常常談論的RGB調色板,然後面的A | a表示的是Alpha值,透明值。
材質就是這個物體看起來是什麼質地的。包含物體表面的色彩、紋理、光滑度、透明度、反射率、折射率、發光度等等。
在Direct3D中能夠經過定義物體的材質(materials)來進行模擬現實生活中的一些材質反映的現象,如樹葉是綠色,地板的光滑度等。該材質結構體能夠經過定義物體表面 對各類顏色光的反射比例。
;//材質(materials)的結構體定義 typedef struct D3DMATERIAL9 { D3DCOLORVALUE Diffuse; //漫射光的反射率 D3DCOLORVALUE Ambient; //環境光的反射率 D3DCOLORVALUE Specular; //鏡面光的反射率 D3DCOLORVALUE Emissive; //亮度值 float Power; //銳度 }D3DMATERIAL9,*LPD3DMATERIAL9;
Diffuse:指定材質對漫射光的反射率。
Ambient:指定材質對環境光的反射率。
Specular:指定材質對鏡面光的反射率。
Emissive:用於加強物體的亮度值,使之看起來好像本身在發光同樣。
Power:指定鏡面高光點的銳度。
若有一個紅色的球體,只反射紅色光,而吸取其餘的全部光,按如下定義:
// D3DMATERIAL9 red; ZeroMemory(&red,sizeof(red)); red.Diffuse=D3DXCOLOR(1.0f,0.0f,0.0f,1.0f); red.Ambient=D3DXCOLOR(1.0f,0.0f,0.0f,1.0f); red.Specular=D3DXCOLOR(1.0f,0.0f,0.0f,1.0f); red.Emissive=D3DXCOLOR(0.0f,0.0f,0.0f,1.0f); //不加強亮度 red.Power=5.0f;
面法線:
頂點法線:
法線的做用主要是將入射光進行反射,在Direct3D中只需知道頂點的發線位置,就能夠肯定光線到達表面時的入射角。
注意:頂點法線有時候不必定和麪法線相同。
在Direct3D中支持的光源也和現實生活中的相似:
一、點光源(Point lights):在一個固定的位置,並向全部方向發射光線。
二、方向光(Directional lights):沿着某條特定的路徑發射光線。
三、聚光燈(Spot lights):相似於現實生活中的手電筒發出的光,發射的光線呈錐形。
在Direct3D中,光源能夠採用結構D3DLIGHT9來表示:
// typedef struct D3DLIGHT9 { D3DLIGHTTYPE Type; D3DCOLORVALUE Diffuse; D3DCOLORVALUE Specular; D3DCOLORVALUE Ambient; D3DVECTOR Position; D3DVECTOR Direction; float Range; float Falloff; float Attenuation0; float Attenuation1; float Attenuation2; float Theta; float Phi; }D3DLIGHT9,*LPD3DLIGHT;
Type:定義所要建立的光源類型。即點光源(Point Lights)、方向光(Directional Lights)、聚光燈(Spot Lights)。
Diffuse:所發出的漫射光的顏色。
Specular:所發出的鏡面光的顏色。
Ambient:所發出的環境光的顏色。
Position:描述光源所在的地方。
Direction:描述光在座標系中傳播方向的向量。
Range:光程,光能射到多遠。
Falloff:僅僅用於聚光燈。表示光強由內到外的衰減方式。
Attenuation0、Attenuation一、Attenuation2:定義了光強隨距離衰減的方式。
Theta:僅用於聚光燈,表示內部錐形的圓錐角。
Phi:和Theta同樣,不過用於表示外部錐形的圓錐角。
最後成果截圖: