2014-01-14 1 views
0

У меня есть следующий код: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(); 

Проблема заключается в том, что программа сохраняет нарушение на функцию блокировки() для вершины буфера. Ошибка, которую я получаю, - это «нарушение прав доступа». Но дело в том, что это отлично работает, если я поставлю 0 на флаг.

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

ответ

1

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

0

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

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

MSDN link for usage flag descriptions

Смежные вопросы