共用方式為


存取頂點緩衝區的內容 (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 結構的成員。

頂點緩衝區