光照(light)

光照(light)是爲了加強遊戲場景的真實感而存在,也有助於描述實體形狀和立體感,算是3D遊戲中渲染的基礎了。spa

如:.net

 

1、認識光照:

在Direct3D的光照模型中,光源發出的光由如下三種類型組成(和現實生活中的相似)。3d

一、環境光(Ambient light):這種光經其餘表面反射到達物體表面,並照亮整個場景。如現實生活中的樹葉同樣,只被環境光必定程度的照亮,而不是直接照射,之因此呈現      出綠色,那是由於它對綠色光產生了反射。code

二、漫射光(Diffuse Light):這種光沿着特定的方向傳播。當它到達某一個表面時,將沿着各個方向均勻反射,即不管從什麼角度看,該表面的亮度均相同。blog

三、鏡面光(Specular Light):這種光和上面的漫射光(Diffuse Light)相似,都是沿着特定的方向傳播,不過鏡面光(Specular Light)到達物體的表面時,只沿着另一個方         向反射,從而造成只能在必定範圍內才能觀測到的高亮度照射。遊戲

Tip:ip

鏡面光和另外兩種光比較起來,計算量要大得多,因此選擇時應該權衡下。get

在Direct3D中,每種類型的光均可以用D3DCOLORVALUED3DXCOLOR來表示。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值,透明值。

 

2、認識材質:

       材質就是這個物體看起來是什麼質地的。包含物體表面的色彩、紋理、光滑度、透明度、反射率、折射率、發光度等等。

              在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;

 

 

 

3、認識法線:

 

 

面法線:

 

頂點法線:

 

法線的做用主要是將入射光進行反射,在Direct3D中只需知道頂點的發線位置,就能夠肯定光線到達表面時的入射角。

注意:頂點法線有時候不必定和麪法線相同。

 

 

4、光源

在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同樣,不過用於表示外部錐形的圓錐角。

 

最後成果截圖:

 

點擊打開連接