Отображение динамического буфера в Direct3D11 в приложении Магазина Windows

Я пытаюсь сделать экземпляр геометрии в Direct3D11, и ID3D11DeviceContext1->Map() Ошибка вызова с очень полезной ошибкой «Неверный параметр», когда я пытаюсь обновить буфер экземпляра.

Буфер объявлен как переменная-член:

Microsoft::WRL::ComPtr<ID3D11Buffer> m_instanceBuffer;

Затем я создаю это (что успешно):

D3D11_BUFFER_DESC instanceDesc;
ZeroMemory(&instanceDesc, sizeof(D3D11_BUFFER_DESC));
instanceDesc.Usage = D3D11_USAGE_DYNAMIC;
instanceDesc.ByteWidth = sizeof(InstanceData) * MAX_INSTANCE_COUNT;
instanceDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
instanceDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
instanceDesc.MiscFlags = 0;
instanceDesc.StructureByteStride = 0;

DX::ThrowIfFailed(d3dDevice->CreateBuffer(&instanceDesc, NULL, &m_instanceBuffer));

Однако, когда я пытаюсь отобразить это:

D3D11_MAPPED_SUBRESOURCE inst;
DX::ThrowIfFailed(d3dContext->Map(m_instanceBuffer.Get(), 0, D3D11_MAP_WRITE, 0, &inst));

Ошибка вызова карты с E_INVALIDARG, Ничего NULL неправильно, и это одно из моих первых приложений D3D, в настоящее время я нахожусь в тупике, что делать дальше, чтобы отследить его. Я думаю, что я должен создавать буфер неправильно, но я не могу понять, как. Любой вклад будет оценен.

0

Решение

Поскольку буфер был создан с D3D11_USAGE_DYNAMIC, это должно было быть сопоставлено с D3D_MAP_WRITE_DISCARD (или же D3D_MAP_WRITE_NO_OVERWRITE, но это было неуместно для моего приложения).

2

Другие решения

У меня была такая же проблема, когда я пытался создать буфер для шейдера. На createBuffer это всегда дало бы мне E_INVALIDARG,
Проблема в моем проекте заключалась в том, что я забыл выровнять все атрибуты по 16 байтам. вот пример:

struct TessellationBufferType
{
float tessellationAmount; //4bytes
D3DXVECTOR3 cameraPosition; //12bytes
};

и если вы не получите 16, добавьте дополнительную переменную (например, padding), чтобы выровнять до 16:

struct LightBufferType
{
D3DXVECTOR4 ambientColor; //16
D3DXVECTOR4 diffuseColor; //16
D3DXVECTOR3 lightDirection; //12
float padding; //4
};
0

По вопросам рекламы [email protected]