DirectX 圖形介面指南(5) (轉)
指南四:建立和使用光源: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DirectX 圖形介面指南(2) (轉)
- DirectX 圖形介面指南(4) (轉)
- DirectX 圖形介面指南(3) (轉)
- DirectX 圖形介面指南(6) (轉)
- DirectX 圖形介面指南(7) (轉)
- DirectX圖形介面指南的介紹(轉)
- 圖形使用者介面(轉)
- 急救~進不了圖形介面(轉)
- 《WTL起步 - 玩轉圖形介面》目錄 (轉)
- 騰訊力作!超實用的iOS 9 人機介面指南(5):圖示與圖形設計iOS
- DirectX8程式設計指南-1 (轉)程式設計
- centos 圖形介面和命令列介面切換(轉載)CentOS命令列
- Linux圖形介面知識-輕鬆更換圖形環境(轉)Linux
- DirectX5.0最新遊戲程式設計指南 (轉)遊戲程式設計
- AIX圖形介面配置AI
- DirectX5.0最新遊戲程式設計指南 DirectDraw教程篇 一、配置DirectX SDK (轉)遊戲程式設計
- rhel5_無法啟動圖形介面_X serverServer
- (轉)使用yum來安裝CentOS圖形介面包CentOS
- VNC連線圖形介面VNC
- 理解FreeBSD中的圖形介面X系統(轉)
- Linux下的GTK圖形介面程式設計(轉)Linux程式設計
- Linux字元介面和圖形介面Linux字元
- DirectX5.0最新遊戲程式設計指南 DirectDraw篇 一、DirectDraw的基本圖象概念 (轉)遊戲程式設計
- RenderDoc圖形偵錯程式詳細使用教程(基於DirectX11)
- 圖形介面系統XFree86的歷史(轉)
- Win32彙編教程八 圖形介面的操作 (轉)Win32
- Linux圖形介面GNOME和KDE終獲統一(轉)Linux
- ffmpeg 圖形化介面工具 traGtor
- 試試python圖形介面Python
- Linux 安裝圖形介面Linux
- 26 使用者圖形介面
- 07圖形化介面和命令列介面操作命令列
- 帶你走進圖形使用者介面編制 (一) (轉)
- 配置XDM--一種Linux的圖形登入介面(轉)Linux
- 讓redhat9 自動進入圖形登陸介面(轉)Redhat
- Linux字元介面切換到圖形介面Linux字元
- linux圖形介面和命令列介面切換Linux命令列
- 使用SCRT+XMING 圖形介面