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 );
在使用燈光的時候需要注意的一點是,要為每個頂點設定法線,只有設置了法線,燈光才會起作用。什麼是法線?其實就是一個和該點所在面垂直的向量。
- Jun 30 Thu 2011 11:56
DirectX D3DLIGHT9
close
全站熱搜
留言列表
發表留言