映射导致"Already Mapped Error"的动态纹理
Mapping dynamic texture causing "Already Mapped Error"
我刚开始使用Direct3D11,我正试图创建一个动态纹理,我计划每秒更新几次新数据。我的问题是,每次我用新数据更新纹理,我从D3D调试器得到这个错误:
D3D11: ERROR: ID3D11DeviceContext::Map:此资源已被映射![RESOURCE_MANIPULATION ERROR #2097213: resource_map_alreadymap]
在运行应用程序一段时间后,最终从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 #动态
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之前所做的只是创建一个窗口。
有趣的是,当你开始对你卡住的事情提出问题时,发现问题变得更容易了,哈哈。
我知道问题是什么了。这是我的HR宏,我围绕着地图调用。
#define HR(x)
{
HRESULT hr = (x);
if(FAILED(x))
{
DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true);
}
}
我不知道为什么它会是问题的根源,但我绝对想知道这个宏如何与Map调用有问题。
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 控制允许动态运行c++的并发操作数
- SFML纹理像播放器
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- OpenGL大的3D纹理(>2GB)非常慢
- UE4.动态纹理创建和 mipmap
- 在 SFML 中不使用动态内存时显示白色纹理代替实际纹理
- 如何在OpenGL中动态跟踪纹理单位?
- Qt3D 动态纹理
- OpenGL:动态更改纹理坐标
- CUDA动态并行性:使用纹理内存时无效的全局写入
- 映射导致"Already Mapped Error"的动态纹理
- Android:如何动态改变OpenGL ES纹理图像