存取頂點緩衝區的內容 (Direct3D 9)
頂點緩衝區物件可讓應用程式直接存取為頂點資料配置的記憶體。 您可以呼叫 IDirect3DVertexBuffer9::Lock 方法來擷取頂點緩衝區記憶體的指標,然後視需要存取記憶體,以填滿緩衝區的新頂點資料,或讀取它已包含的任何資料。 IDirect3DVertexBuffer9::Lock方法接受四個參數。 第一個 OffsetToLock是頂點資料的位移。 第二個參數是頂點資料的大小,以位元組為單位。 接受的第三個參數是指向頂點資料的指標位址,如果呼叫成功。
最後一個參數 Flags會告知系統應該如何鎖定記憶體。 根據頂點資料存取的方式,指定 Flags 參數的常數。 請確定為 D3DUSAGE 選擇的值符合為 D3DLOCK選擇的值。 例如,如果您要建立只具有寫入存取權的頂點緩衝區,則藉由指定 D3DLOCK_READONLY 來嘗試讀取資料並不合理。 使用這些旗標可讓驅動程式在要求存取類型的情況下鎖定記憶體,並提供最佳效能。
完成填滿或讀取頂點資料之後,請呼叫 IDirect3DVertexBuffer9::Unlock 方法,如下列程式碼範例所示。
// This code example assumes the g_pVB is a variable of type
// LPDIRECT3DVERTEXBUFFER9 and that g_Vertices has been
// properly initialized with vertices
// Lock the buffer to gain access to the vertices
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();
如果您使用 D3DUSAGE_WRITEONLY 旗標建立頂點緩衝區,請勿使用D3DLOCK_READONLY鎖定旗標。 如果您的應用程式只會從頂點緩衝區記憶體讀取,請使用 D3DLOCK_READONLY 旗標。 包含此旗標可讓 Direct3D 優化其內部程式以改善效率,因為記憶體的存取權將是唯讀的。
如需使用IDirect3DVertexBuffer9::Lock的 Flags 參數D3DLOCK_DISCARD或D3DLOCK_NOOVERWRITE的相關資訊,請參閱使用動態頂點和索引緩衝區。
在 C++ 中,因為您直接存取為頂點緩衝區配置的記憶體,所以請確定您的應用程式正確地存取配置的記憶體。 否則,您會有轉譯該記憶體不正確風險。 使用應用程式用來從配置緩衝區中的某個頂點移至另一個頂點的頂點格式的步調。 頂點緩衝區記憶體是 FVF 中指定的簡單頂點陣列。 使用您所定義之任何頂點格式結構的步進。 您可以檢查頂點緩衝區描述中包含的 D3DFVF ,以計算執行時間每個頂點的步幅。 下表顯示每個頂點元件的大小。
頂點格式旗標 | 大小 |
---|---|
D3DFVF_DIFFUSE | sizeof (DWORD) |
D3DFVF_NORMAL | sizeof (float) x 3 |
D3DFVF_SPECULAR | sizeof (DWORD) |
D3DFVF_TEXn | sizeof (float) x n |
D3DFVF_XYZ | sizeof (float) x 3 |
D3DFVF_XYZRHW | sizeof (float) x 4 |
頂點格式中存在的紋理座標數目是由 D3DFVF_TEX n 旗標所描述, (其中 n 是 0 到 8) 的值。 將紋理座標集的數目乘以一組紋理座標的大小,範圍可以從一到四個浮點數,以計算該紋理座標數目所需的記憶體。
使用頂點步進總計,視需要遞增和遞減記憶體指標,以存取特定的頂點。
擷取頂點緩衝區描述
您可以藉由呼叫 IDirect3DVertexBuffer9::GetDesc 方法來擷取頂點緩衝區的相關資訊。 這個方法會將頂點緩衝區的相關資訊填入 D3DVERTEXBUFFER_DESC 結構的成員。
相關主題