2011-07-16 122 views
5

我剛開始使用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之前所做的一切都是創建一個窗口。

回答

2

它有趣的是,當你開始詢問你困擾的事情時,就會更容易找到問題。

我想出了問題所在。這是我的人力資源宏,我周圍的地圖通話。

#define HR(x)             
{                
    HRESULT hr = (x);           
    if(FAILED(x))            
    {               
     DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true); 
    }              
} 

我不知道爲什麼它會問題的根源,但我絕對想知道這個宏將如何有問題與地圖調用。

+4

問題是您正在運行該功能兩次。你應該這樣做:HRESULT hr =(x); if(FAILED(hr)) – notabene