存取頂點緩衝區的內容 (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 優化其內部程式以改善效率,因為記憶體的存取將會是唯讀的。
如需查看關於使用 D3DLOCK_DISCARD 或 D3DLOCK_NOOVERWRITE 作為 IDirect3DVertexBuffer9::Lock的 Flags 參數的資料,請參閱 使用動態頂點和索引緩衝區。
在 C++ 中,因為您直接存取為頂點緩衝區配置的記憶體,因此請確定您的應用程式正確地存取配置的記憶體。 否則,您可能會使那段記憶無效。 使用應用程式的頂點格式中的步幅,以便從配置的緩衝區中一個頂點移至另一個頂點。 頂點緩衝區內存是 FVF 中指定的簡單頂點陣列。 使用您所定義之頂點格式結構的步幅。 透過檢查頂點緩衝區描述中所含的 D3DFVF,您可以在運行時計算每個頂點的步幅。 下表顯示每個頂點元件的大小。
頂點格式旗標 | 大小 |
---|---|
D3DFVF_DIFFUSE | sizeof(DWORD) |
D3DFVF_NORMAL | sizeof(float) x 3 |
D3DFVF_SPECULAR | sizeof(DWORD) |
D3DFVF_TEXn | sizeof(float) × n |
D3DFVF_XYZ | sizeof(float) x 3 |
D3DFVF_XYZRHW | sizeof(float) x 4 |
頂點格式中的紋理座標數目是由 D3DFVF_TEX n 旗標所描述(其中 n 是 0 到 8 的值)。 將紋理座標集數目乘以一組紋理座標的大小,其範圍可以從一到四個浮點數,以計算該紋理坐標數目所需的記憶體。
使用總頂點步幅來視需要遞增和遞減記憶體指標,以存取特定頂點。
擷取頂點緩衝區描述
您可以呼叫 IDirect3DVertexBuffer9::GetDesc 方法來擷取頂點緩衝區的相關信息。 這個方法會將頂點緩衝區的相關信息填入 D3DVERTEXBUFFER_DESC 結構的成員。
相關主題