Direct3D11を使い始めたばかりで、1秒間に数回新しいデータで更新する予定の動的テクスチャを作成しようとしています。私の問題は、新しいデータでテクスチャを更新するたびに、D3Dデバッガーから次のエラーが発生することです。
D3D11:エラー:ID3D11DeviceContext :: Map:このリソースはすでにマップされています![RESOURCE_MANIPULATION ERROR#2097213:RESOURCE_MAP_ALREADYMAPPED]
これは、アプリケーションをしばらく実行した後、最終的にMap呼び出しからのE_OUTOFMEMORYエラーになります。
私は次のようなテクスチャを作成しています:
D3D11_TEXTURE2D_DESC td;
td.ArraySize = 1;
td.BindFlags = D3D11_BIND_SHADER_RESOURCE;
td.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
td.Format = DXGI_FORMAT_B8G8R8X8_UNORM;
td.Height = height;
td.Width = width;
td.MipLevels = 1;
td.MiscFlags = 0;
td.SampleDesc.Count = 1;
td.SampleDesc.Quality = 0;
td.Usage = D3D11_USAGE_DYNAMIC;
HR(m_device->CreateTexture2D(&td, 0, &texture));
次のようにデータを更新します。
HR(m_deviceContext->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource));
BYTE* mappedData = reinterpret_cast<BYTE*>(mappedResource.pData);
for(UINT i = 0; i < height; ++i)
{
memcpy(mappedData, buffer,rowspan);
mappedData += mappedResource.RowPitch;
buffer += rowspan;
}
m_deviceContext->Unmap(texture, 0);
テクスチャを作成してデータをマップする前に、プログラムで行ったのはDirect3Dデバイスを初期化することだけです。私は自分が間違っていることに完全に困惑しています。私はこれについてmsdnでできる限り多くのことを読み込もうとしてきましたが、何が問題になっているのかを理解するのに何の助けにもなりませんでした。msdnによると、私は適切な手順を踏んでいます。
http://msdn.microsoft.com/en-us/library/ff476905(v=vs.85).aspx#Dynamic
To fill a dynamic texture (one created with D3D11_USAGE_DYNAMIC):
Get a pointer to the texture memory by passing in D3D11_MAP_WRITE_DISCARD when calling
ID3D11DeviceContext::Map.
Write data to the memory.
Call ID3D11DeviceContext::Unmap when you are finished writing data.
テクスチャの説明も正しく記入していると確信しています。
この問題は、d3dデバイスの初期化に起因している可能性がありますか?マップ機能を誤用していませんか?十分な背景情報を提供しませんでしたか?何が起こっているのかについて何かアイデアはありますか?
追加情報:頂点シェーダーの定数バッファーにデータをマップしようとすると、同じ「リソースが既にマップされています」エラーが発生します。また、別のコンピューターでテストしたところ、同じマッピングの問題が発生しました。
更新:D3D11のチュートリアルコードをダウンロードし、テクスチャの作成とマッピングコードを取得して、チュートリアルコードがd3dの初期化を完了した直後にそれを挿入しました。マッピングエラーが発生するかどうかを確認したかっただけです。予想どおり、「リソースは既にマップされています」というエラーは発生しませんでした。さらに、チュートリアルからd3d初期化コードをコピーして自分のものに置き換えると、リソースのマップ済みエラーが発生し、d3dを初期化する前にウィンドウを作成するだけなので、さらに混乱します。