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

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

指南二:演示頂點(Render Vertex):namespace prefix = o ns = "urn:schemas--com::office" />

 

Microsoft Direct3D 寫的應用使用頂點(Vertex)構造幾何物體。每一個三維空間 (3D) 場景包括一個或幾個這樣的幾何物體。Vertices 例程構造簡單的物體,一個三角形,並且將它繪製到螢幕上。

 

本指南說明如何採用以下步驟從頂點構造一個三角形:

 

·第一步:定義一個自定義頂點型別

·第二步:設定頂點緩衝

·第三步:繪製至螢幕

注意:Vertices 示例程式的路徑為:

(SDK )SamplesMultimediaDirect3DTutorialsTut02_Vertices.

 

Vertices 程式的示例程式碼與 CreateDevice 的程式碼大部分相同。本“演示頂點(Render Vertex)”指南僅僅關注於那些獨特的,關於頂點的程式碼而不包括初始化 Direct3D,處理 Microsoft 訊息,繪圖,與清理等工作。如要得到有關這些任務的資訊,請參考 指南一:建立裝置

 

第一步:定義一個自定義頂點型別

 

Vertices 例程使用三個頂點構造一個 2D 的三角形。這裡提及了頂點緩衝的概念,這是用於儲存和演示大量頂點的 Microsoft Direct3D 。透過指定一個自定義的頂點結構和相應的可變向量格式 (FVF),頂點能夠採用很多方法定義。本 Vertices 例程使用的頂點格式定義於以下程式碼片斷中。

 

struct CUSTOMVERTEX

{

  FLOAT x, y, z, rhw; // The tranormed position for the vertex.

  D color;  // The vertex color.

};

 

上面的結構體說明了自定義頂點型別的格式。下一步是定義 FVF 以描述頂點緩衝區中的頂點內容。以下程式碼片段定義了一個 FVF 並符合此上建立的自定義頂點型別。

 

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

 

可變頂點格式標記描述了使用中的自定義頂點型別。前述示例程式碼使用了 D3DFVF_XYZRHW 和 D3DFVF_DIFFUSE 標誌,這將告訴頂點緩衝,自定義頂點型別包含一組轉換過的點座標並緊跟著一個顏色引數。

 

現在自定義向量格式和 FVF 已經被指定好了,下一步將使用頂點填充頂點緩衝區,請參看:第二步:設定頂點緩衝

 

注意:Vertices 例程中的頂點是轉換過的。用另一句話說,它們已經在 2D 視窗座標系下。這意味著座標點 (0,0) 位於左上角,且正的 x 半軸向右,正的 y 半軸向下。這些頂點同樣也是光照過的,這說明它們的著色不透過 Direct3D 照明而由它們自己的顏色代替。

 

第二步:設定頂點緩衝

 

現在自定義頂點格式已經完成,初始化頂點的時候到了。 Vertices 例程建立了必需的 Microsoft Direct3D 物件之後本程式內部定義的 InitVB() 進行這個工作。以下程式碼段將初始化三個自定義頂點的值。

 

CUSTOMVERTEX g_Vertices[] =

{

  { 150.0f,  50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color

  { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },

  {  50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },

};

 

前述程式碼片段採用三角形的三個頂點填充三個Vertex並指定了每個頂點的散射光的顏色。第一個頂點位於 (150,50) ,散射紅色 (0xffff0000)。第二個頂點位於 (250,250) ,為綠色 (0xff00ff00)。第三點位於 (50,250) 並散射藍綠色 (0xff00ffff)。每一點都具有相同的 0.5 Z值及 1.0 的 RHW 引數。關於這些向量格式的其它資訊見 SDK: Transformed and Lit Vertices

 

下一步將呼叫 IDirect3DDevice8::CreateVertexBuffer 建立頂點緩衝區,如以下程式碼段所示:

 

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

  0 /* Usage */, D3DFVF_CUSTOMVERTEX,

  D3DPOOL_DEFAULT, &g_p) ) )

  return E_FAIL;

 

CreateVertexBuffer 的頭兩個引數告訴 Direct3D 新頂點緩衝區預計的大小和用法。緊跟的兩個引數指定新緩衝區的向量格式及位置。這裡的向量格式是 D3DFVF_CUSTOMVERTEX,就是例程先前定義的 FVF 值。D3DPOOL_DEFAULT 標記告訴 Direct3D 在最合適的位置建立此頂點緩衝區。最後一個引數返回建立完成的頂點緩衝區物件地址。

 

建立了頂點緩衝區之後,如以下程式碼段所示,開始採用自定義格式的頂點填充緩衝區中的資料。

 

VOID* pVertices;

if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (BYTE**)&pVertices, 0 ) ) )

  return E_FAIL;

memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );

g_pVB->Unlock();

 

首先呼叫 IDirect3DVertexBuffer8::Lock 鎖定頂點緩衝區。函式第一個引數是鎖定頂點資料的偏移量,按位元組計算。第二個引數是需鎖定的頂點資料長度,同樣按位元組計算。第三個引數是一個 BYTE 型別指標的地址,用於返回指向頂點資料的地址。第四個引數告知頂點緩衝區如何鎖定資料。

 

透過使用 memcpy,頂點被複制到頂點緩衝區裡。將頂點放入緩衝區之後,呼叫一次 IDirect3DVertexBuffer8::Unlock 以解鎖頂點緩衝區。這個鎖定——解鎖機制是必需的,因為正在使用的頂點緩衝區可能位於裝置中。

 

現在頂點緩衝區已經填入頂點,繪製到顯示的時候到了,見描述:第三步:繪製至螢幕

 

第三步:繪製至螢幕

 

現在緩衝區已經填入頂點,現在需要把它繪製到螢幕上。在繪製到螢幕之前,先將背景清除為藍色並呼叫 BeginScene。

 

g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0L );

g_pd3dDevice->BeginScene();

 

從頂點緩衝區繪製頂點資料需要一些步驟。首先,你需要設定流資料來源;在當前情況下,使用第 0 個流 。流的資料來源是透過呼叫 IDirect3DDevice8::SetStream 設定的。

 

g_pd3dDevice->SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX) );

 

SetStreamSource 的第一個引數告訴 Microsoft Direct3D 裝置設定資料流的。第二個引數是繫結在該資料流上的頂點緩衝區。第三個引數是資料單元的大小,用位元組數表示。在上面的示例程式碼中,將使用CUSTOMVERTEX 的大小作為資料單元的大小。

 

下一步透過呼叫 IDirect3DDevice8::SetVertexShader 使 Direct3D 瞭解使用中的頂點(Vertex Shader)。就整體而言,自定義頂點處理器是一種高階的話題,但是在絕大多數情況下頂點處理器僅僅等於 FVF 程式碼。這能夠讓 Direct3D 知道處理中的頂點型別。以下程式碼片段將FVF設定為當前頂點處理器:

 

g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );

 

SetVertexShader() 唯一的引數是當前設定的頂點處理器的控制程式碼。這個引數的值可以是從IDirect3DDevice8::CreateVertexShader 返回的控制程式碼,或者是 FVF 程式碼。在這兒,使用的引數是定義為 D3DFVF_CUSTOMVERTEX 的 FVF 程式碼。

 

關於頂點處理器的更多資訊,請見 SDK: Vertex Shader 一章。

 

下一步使用 IDirect3DDevice8::DrawPrimitive 繪製頂點緩衝區中的頂點,見以下程式碼片段:

 

g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

 

DrawPrimitive 接受的第一個引數是一個標記,它通知 Direct3D 繪製哪種型別的物件(Primitive)。本例程使用 D3DPT_TRIANGLELIST 標記指定為三角形序列。第二個引數是第一個頂點的索引。第三個引數通知繪製的物件的數目。本例子只畫一個三角形,這個值為 1。

 

關於不同種類物件的更多資訊,可見 SDK: 3-D Primitive

 

最後的一步是結束場景並立即將後背緩衝提交為前景緩衝。這些寫在以下程式碼片段中:

 

g_pd3dDevice->EndScene();

g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

 

當後背緩衝被提交為前景緩衝後,客戶視窗將顯示出一個三個點顏色各異的三角形。

 

本指南已經指導你如何使用頂點構造幾何外形了。指南三:使用矩陣 將介紹矩陣的概念以及如何使用它們。

 

指南三:使用矩陣 見本文第四部分)

 


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

相關文章