DirectX 11, исключение выдается при обновлении постоянного буфера с UpdateSubresource - PullRequest
0 голосов
/ 19 декабря 2018

Итак, я очень новичок в DirectX и пытаюсь изучить основы, но у меня возникла проблема с моим постоянным буфером.Я пытаюсь отправить структуру с тремя матрицами в вершинный шейдер, но когда я пытаюсь обновить буфер с помощью UpdateSubresource, я получаю «Исключение выдается в 0x710B5DF3 (d3d11.dll) в Demo.exe: 0xC0000005: Место чтения нарушения доступа0x0000003C».

Моя структура:

struct Matracies
{
   DirectX::XMMATRIX projection;
   DirectX::XMMATRIX world;
   DirectX::XMMATRIX view;
};
Matracies matracies;

Создание буфера:

ID3D11Buffer*  ConstantBuffer = nullptr;
D3D11_BUFFER_DESC Buffer;
memset(&Buffer, 0, sizeof(Buffer));

Buffer.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
Buffer.Usage = D3D11_USAGE_DEFAULT;
Buffer.ByteWidth = sizeof(Matracies);
Buffer.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;

D3D11_SUBRESOURCE_DATA data;
data.pSysMem = &matracies;
data.SysMemPitch = 0;
data.SysMemSlicePitch = 0;

Device->CreateBuffer(&Buffer, &data, &ConstantBuffer);
DeviceContext->VSSetConstantBuffers(0, 1, &ConstantBuffer);

Обновление буфера:

DeviceContext->UpdateSubresource(ConstantBuffer, 0, 0, &matracies, 0, 0);

Я не уверен, какая информация имеет отношениечтобы решить эту проблему, дайте мне знать, если чего-то не хватает.

1 Ответ

0 голосов
/ 20 декабря 2018

Добро пожаловать в шерстяной мир DirectX!

Первые два шага в отладке любой программы DirectX:

(1) Включите устройство отладки.См. этот блог .Это создаст дополнительные выходные данные отладки во время выполнения, которые дают подсказки о проблемах, подобных той, что у вас есть выше.

(2) Если функция возвращает HRESULT, вы должны проверить это на предмет успеха или сбоя во время выполнения.Если было бы безопасно игнорировать возвращаемое значение, оно вернуло бы void.См. эту страницу .

Если бы вы выполнили одно или оба из вышеперечисленных действий, вы бы поймали ошибку, возвращенную из CreateBuffer выше, что привело к тому, что ConstantBuffer по-прежнему был нулевым, когдаВы позвонили UpdateSubresource.

. Причина, по которой это не удалось, заключается в том, что вы в общем случае не можете создать постоянный буфер, равный D3D11_USAGE_DEFAULT и D3D11_CPU_ACCESS_WRITE.Память использования ПО УМОЛЧАНИЮ часто находится в видеопамяти, которая недоступна для процессора.Поскольку вы используете UpdateSubresource, а не Map, вы должны просто использовать:

Buffer.CPUAccessFlags = 0;

Вы должны взглянуть на DirectX Tool Kit и связанные с ним учебные пособия.

...