Я пытаюсь сделать экземпляр геометрии в 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, в настоящее время я нахожусь в тупике, что делать дальше, чтобы отследить его. Я думаю, что я должен создавать буфер неправильно, но я не могу понять, как. Любой вклад будет оценен.
Поскольку буфер был создан с D3D11_USAGE_DYNAMIC
, это должно было быть сопоставлено с D3D_MAP_WRITE_DISCARD
(или же D3D_MAP_WRITE_NO_OVERWRITE
, но это было неуместно для моего приложения).
У меня была такая же проблема, когда я пытался создать буфер для шейдера. На 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
};