5

我刚开始使用 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));

并像这样更新其数据:

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 之前所做的只是创建一个窗口。

4

1 回答 1

2

有趣的是,当您开始就您坚持的问题提出问题时,发现问题变得更容易哈哈。

我弄清楚了问题所在。这是我围绕地图调用的 HR 宏。

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

我不知道为什么它会成为问题的根源,但我绝对想知道这个宏如何与 Map 调用产生问题。

于 2011-07-18T17:09:49.680 回答