0

我正在尝试在 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 应用程序之一,我目前不知道下一步该做什么来追踪它。我想我一定是错误地创建了缓冲区,但我不知道怎么做。任何输入将不胜感激。

4

2 回答 2

1

因为缓冲区是用 创建的D3D11_USAGE_DYNAMIC,所以它必须用D3D_MAP_WRITE_DISCARD(或D3D_MAP_WRITE_NO_OVERWRITE,但这不适合我的应用程序)进行映射。

于 2012-12-06T06:58:58.257 回答
0

当我尝试为着色器创建缓冲区时,我遇到了同样的问题。在createBuffer它总是给我E_INVALIDARG。我项目的问题是,我忘记将所有属性对齐到 16 字节。这是一个例子:

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

如果你没有得到 16,添加一个额外的变量(例如填充)只是为了对齐到 16:

struct LightBufferType
{
    D3DXVECTOR4 ambientColor; //16
    D3DXVECTOR4 diffuseColor; //16
    D3DXVECTOR3 lightDirection; //12
    float padding; //4
};
于 2013-02-22T14:46:14.950 回答