close


Direct3D基礎-燈光 D3DLIGHT9 
在D3D中有3種類型的燈光,用它們可以讓3D世界顯得真實 。
一、燈光類型
1、點光(Point Light)
  從一個點向周圍均勻發射的光,有最大的照明範圍,亮度隨距離衰減,最明顯的一個例子就是我們家裡用的燈泡。


2、方向光(Directional Light)
  方向光是一組沒有衰減的平行光,類似太陽光的效果。 


3、聚光燈(Spot Light)
  最複雜的一種燈,有光源點位置、有方向、有範圍、有發光的內徑和外徑,光照強度還會隨距離衰減。類似的例子是電筒。


二、燈光結構
D3D中燈光通過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-燈光類型,共3種:D3DLIGHT_POINT、D3DLIGHT_SPOT、D3DLIGHT_DIRECTIONAL。
Diffuse-光源發出的漫反射光顏色。
Specular-光源發出的鏡面光顏色。
Ambient-光源發出的環境光顏色。
Position-用向量表示的光源世界坐標位置(對方向光無效)。
Direction-用向量表示的光源世界坐標照射方向(對點光源無效)。
Range-燈光能夠傳播的最大範圍(對方向光無效),該值不能應小於。
Falloff-燈光從內圓錐到外圓錐之間的強度衰減(僅對聚光燈有效),該值通常設為1.0f。
Attenuation0、Attenuation1、Attenuation2-燈光衰減變量,用來定義燈光強度的傳播距離衰減(對方向光無效)。
Attenuation0定義恆定衰減,
Attenuation1定義線性衰減,
Attenuation2定義二次衰減。
Attenuation0通常為0.0f,
Attenuation1通常為1.0f,
Attenuation2通常為0.0f。
適當的使用如下公式,D代表到光源的距離,A0、A1、A2分別與Attenuation0、Attenuation1、Attenuation2相匹配。
Theta-指定燈光內圓錐的角度(僅對聚光燈有效),單位是弧度。
Phi-指定外圓錐的角度(僅對聚光燈有效),單位是弧度。


三、燈光的設置
燈光的屬性設置好後,需要把這個燈光加入到場景中:
// 要讓渲染的時候燈光起作用,運行這條命令
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );


// 設置0號燈為我們設置的燈
g_pd3dDevice->SetLight( 0, &light );


// 打開0號燈光
g_pd3dDevice->LightEnable( 0, TRUE );
在使用燈光的時候需要注意的一點是,要為每個頂點設定法線,只有設置了法線,燈光才會起作用。什麼是法線?其實就是一個和該點所在面垂直的向量。


全站熱搜
創作者介紹
創作者 createps 的頭像
createps

遊戲人生 人生遊戲

createps 發表在 痞客邦 留言(0) 人氣()