Сбой программы DirectX 9 Vertex Buffer при использовании флага D3DUSAGE_DYNAMIC

У меня есть следующий код:

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();

Проблема в том, что программа продолжает нарушать функцию Lock() для буфера вершин. Ошибка, которую я получаю, это "нарушение доступа". Но дело в том, что это работало нормально, если я поставил 0 для флага.

И поскольку я хотел изменить положение вершин буфера, я попытался изменить его на D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY и теперь это перестало работать. Понятия не имею почему. Пожалуйста помоги

2 ответа

Решение

Я выяснил, в чем проблема: потому что я использую D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, он не работает с D3DPOOL_MANAGED. Я переключил его на D3DPOOL_DEFAULT, и он работал.

D3DUSAGE_DYNAMIC и D3DUSAGE_WRITEONLY конфликтуют. Они указывают, где разместить буфер вершин в памяти. Скорее всего, когда вы блокируете и пытаетесь получить доступ к памяти, он не знает, куда обращаться.

Я обычно использую DYNAMIC для буферов, которые я собираюсь часто менять. Идите только с этим флагом и посмотрите, поможет ли это вам немного.

Ссылка MSDN для описания флага использования

Другие вопросы по тегам