2014-01-14 73 views
0

我有以下代碼:DirectX 9的頂點緩存使用D3DUSAGE_DYNAMIC標誌時crashs程序

DirectX::device->CreateVertexBuffer(sizeof(VERTEX) * vertexCount, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, VERTEXFORMAT, D3DPOOL_MANAGED, &vertexBuffer, NULL); 

VOID* vertexLocking; 
vertexBuffer->Lock(0, 0, (void**)&vertexLocking, 0); 
memcpy(vertexLocking, vertices, sizeof(VERTEX) * vertexCount); 
vertexBuffer->Unlock(); 

的問題是,該方案保持上破鎖()函數的頂點緩衝區。我得到的錯誤是「訪問衝突」。但是,如果我把0換成國旗的話,這一切都很好。

因爲我想緩衝區的頂點位置改變,我試圖將其更改爲D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY,現在它停止工作。我不知道爲什麼。請幫助

回答

1

我發現了問題是什麼:因爲我使用D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY,它不適用於D3DPOOL_MANAGED。我把它切換到D3DPOOL_DEFAULT,它工作。

0

D3DUSAGE_DYNAMIC和D3DUSAGE_WRITEONLY存在衝突。它們指示將Vertex緩衝區放置在內存中的位置。很有可能當你鎖定並嘗試訪問內存時,它不知道在哪裏訪問。

我通常使用DYNAMIC作爲緩衝區,我將經常修改這些緩衝區。只用那個標誌去看看是否能幫助你一點點。

MSDN link for usage flag descriptions