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 アプリの 1 つであり、追跡するために次に何をすべきか現在困惑しています。バッファを間違って作成しているに違いないと思っていますが、方法がわかりません。任意の入力をいただければ幸いです。

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 に答える