我剛開始使用Direct3D11,我試圖創建一個動態紋理,我計劃每秒更新一次新數據。我的問題是每當我用新數據更新紋理時,我都會從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之前所做的一切都是創建一個窗口。
問題是您正在運行該功能兩次。你應該這樣做:HRESULT hr =(x); if(FAILED(hr)) – notabene