DirectX 圖形介面指南(5) (轉)

worldblog發表於2007-12-12
DirectX 圖形介面指南(5) (轉)[@more@]

指南四:建立和使用光源:namespace prefix = o ns = "urn:schemas--com::office" />

 

Microsoft Direc3D 光照給 3-D 物體提供更多的真實性。當使用它時,每個場景中的幾何將被照亮,基於它們的位置和使用的光源型別。這個指南的例程將介紹關於光照和材質的主題。

 

本指南包含以下步驟用於建立材質與光照:

 

·第一步:創始化場景幾何

·第二步:設定材置與光照

注意:Lights 示例的路徑為:

(SDK )SamplesMultimediaDirect3DTutorialsTut04_Lights.

 

注意:Lights 例程中的程式碼和 Matrices 例程的程式碼幾乎完全一樣。“建立和使用光源”指南僅僅關注於有關建立和使用光照的獨特程式碼,而並不重複有關設定 Direct3D,處理 Microsoft 訊息,繪製,或者清理的內容。關於這些任務的其他資訊,見:指南一:建立裝置

 

本指南使用自定義頂點和頂點緩衝區呈遞幾何形體。關於選擇一個自定義頂點格式並頂點緩衝的更多資訊,見:指南二:演示頂點

 

本指南採用矩陣變換幾何物件。關於矩陣和變換的更多資訊,參見:指南三:使用矩陣

 

第一步:創始化場景幾何

 

使用光照的一個前提是每個表面都應該有法向量。為此,Lights 例程使用一個稍微不同的自定義頂點格式,新的自定義頂點格式具有一個 3-D 位置座標和一個表面法向量。這個表面法向量被用於 Microsoft Direct3D 光照計算的核心。

 

struct CUSTOMVERTEX

{

  D3DXVECTOR3 position; // The 3-D position for the vertex.

  D3DXVECTOR3 normal;  // The surface normal for the vertex.

};

 

// Custom FVF.

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)

 

現在適當的向量格式定義好了,Lights 例程 InitGeometry(),一個程式自定義的以建立一個圓柱體。最初的步驟是建立一個頂點緩衝區並用它儲存這個圓柱體的各點,如以下例程式碼所示:

 

// Create the vertex buffer.

if( FAILED( g_pd3dDevice->CreateVertexBuffer( 50*2*sizeof(CUSTOMVERTEX),

  0 /* Usage */, D3DFVF_CUSTOMVERTEX,

  D3DPOOL_DEFAULT, &g_p) ) )

  return E_FAIL;

 

下一步是使用圓柱體的頂點填充頂點緩衝區。注意下面的示例程式碼,每個點都被定義了一個位置和一個法向量。

 

for( D i=0; i<50; i++ )

{

  FLOAT theta = (2*D3DX_PI*i)/(50-1);

  pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, co(theta) );

  pVertices[2*i+0].normal  = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );

  pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) );

  pVertices[2*i+1].normal  = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );

}

 

在前述例程使用圓柱體頂點填充了頂點緩衝區之後,這個頂點緩衝區已經準備好用於呈遞了。但是首先,這個場景的材質與光照必須在繪製圓柱體之前被設定。這些描述在 第二步:設定材質與光照

 

第二步:設定材質與光照

 

為了在 Microsoft Direct3D 中使用光照,你必須建立一個或多個光源。為了確定一個幾何物體放射何種顏色的光線,材質必須被建立於繪製幾何物件。在繪製這個場景之前,Lights 例程呼叫 SetupLights,一個程式自定義函式來設定材質和一個方向性光源。

 

建立一種材質

 

材質被定義為當一束光照到幾何物體表面後,反射出的顏色。以下程式碼片段使用 D3DMATERIAL8 結構來建立一個黃色的材質。

 

D3DMATERIAL8 mtrl;

ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) );

mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;

mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;

mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;

mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;

g_pd3dDevice->SetMaterial( &mtrl );

 

這個材質的漫射光顏色與環境光顏色都被設為黃色。對 IDirect3DDevice8::SetMaterial 函式的呼叫將應用此材質到用於繪製場景的 Microsoft Direct3D 裝置。SetMaterial() 接受的唯一引數是設定材質的指標。在這個呼叫完成以後,每個物件都將使用這個材質繪製直到另一次對 SetMaterial 的呼叫指定了一個不同的材質為止。

 

現在材質已經被應用到場景,下一個步驟是建立光源。

 

建立一個光源

 

Microsoft Direct3D 裡有三種可用的光源:點光源,方向形光源,與聚光燈光源。本示例程式碼建立一個方向形光源,它向一個方向發光,並且不停的變換髮光的方向。

 

下列程式碼片段使用 D3DLIGHT8 結構建立一個方向性光源。

 

D3DXVECTOR3 vecDir;

D3DLIGHT8 light;

ZeroMemory( &light, sizeof(D3DLIGHT8) );

light.Type = D3DLIGHT_DIRECTIONAL;

 

下列程式碼片設定光源的漫射光為白色。

 

light.Diffuse.r = 1.0f;

light.Diffuse.g = 1.0f;

light.Diffuse.b = 1.0f;

 

以下程式碼片在一個環內旋轉光源的方向。

 

vecDir = D3DXVECTOR3(cosf(timeGetTime()/360.0f),

  0.0f,

  sinf(timeGetTime()/360.0f) );

D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );

 

對 D3DXVec3Normalize 函式的呼叫將歸一化方向向量並初始化光源的方向。

 

可以設定一個範圍告訴 Direct3D 此光源能影響多遠的距離。這個成員引數對方向性光源無效。以下程式碼片指定此光源的範圍為 1000 單位。

 

light.Range = 1000.0f;

 

下面的程式碼片將這個光源分配到當前的 Direct3D 裝置,透過呼叫 IDirect3DDevice8::SetLight。

 

g_pd3dDevice->SetLight( 0, &light );

 

SetLight 接受的第一個引數是此光源被分配的號。注意如果在此索引已存在一個光源,它將被新光源覆蓋。第二個引數是一個指向新定義光源資料結構的指標。本 Lights 例程設定這個光源位於 0 號索引。

 

下列程式碼片啟用這個光源,透過呼叫 IDirect3DDevice8::LightEnable。

 

g_pd3dDevice->LightEnable( 0, TRUE);

 

LightEnable 接受的第一個引數是啟用光源的索引。第二個引數是一個布林量通知此光源是開 (TRUE) 還是閉 (FALSE)。在上面的例程中,索引 0 上的光源被開啟。

 

以下程式碼片通知 Direct3D 呈遞此光源,透過呼叫 IDirect3DDevice8::SetRenderState。

 

g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );

 

SetRenderState 接受的頭兩個引數是哪一個裝置狀態變數被改寫以及寫入何種值。本例程設定 D3DRS_LIGHTING 裝置變數為 TRUE,這將使裝置能夠演示光照效果。

 

本例程的最後一步是透過再一次呼叫 SetRenderState 開啟環境照明光。

 

g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );

 

當前程式碼段設定 D3DRS_AMBIENT 裝置變數為一種淺灰色 (0x00202020)。環境照明將使用所給的顏色照亮所有的物體。

 

關於照明及材質的更多資訊,參見 SDK: Lights and Materials

 

本例程向你說明了如何使用照明與材質。指南五:使用紋理對映 將向你說明如何將紋理新增到物體表面上。

 

指南五:使用紋理對映 見本文第六部分)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992158/,如需轉載,請註明出處,否則將追究法律責任。

相關文章