我刚刚开始使用Direct3D11,我正在尝试创建一个动态纹理,我计划每秒多次使用新数据进行更新.我的问题是每次用新数据更新纹理时,我都会从D3D调试器中得到这个错误:
D3D11:错误:ID3D11DeviceContext :: Map:此资源已经映射![RESOURCE_MANIPULATION错误#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));
Run Code Online (Sandbox Code Playgroud)
并更新其数据,如下所示:
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);
Run Code Online (Sandbox Code Playgroud)
在创建纹理并将数据映射到它之前,我在程序中所做的就是初始化Direct3D设备.我完全被我做错了所困扰.我一直试图在msdn上尽可能多地阅读这篇文章,但没有任何东西可以帮助我弄清楚出了什么问题.根据msdn,我正在采取适当的步骤:
http://msdn.microsoft.com/en-us/library/ff476905(v=vs.85).aspx#Dynamic
To fill a dynamic …Run Code Online (Sandbox Code Playgroud)