Właśnie zaczynam używać Direct3D11 i próbuję stworzyć dynamiczną teksturę, którą planuję zaktualizować nowymi danymi kilka razy na sekundę. Mój problem polega na tym, że za każdym razem, gdy aktualizuję teksturę o nowe dane, pojawia się ten błąd z D3D Debugger:Odwzorowanie dynamicznej tekstury powodującej "Błąd już zmapowany"
D3D11: BŁĄD: ID3D11DeviceContext :: Mapa: Ten zasób jest już zmapowany! [RESOURCE_MANIPULATION ERROR # 2097213: RESOURCE_MAP_ALREADYMAPPED]
który ostatecznie przekształca się w błąd E_OUTOFMEMORY z rozmowy mapa po uruchomieniu aplikacji na chwilę.
tworzę moją teksturę tak:
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));
i aktualizowania swoich danych tak:
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);
Przed utworzyć teksturę i mapowania danych do niego, wszystko co zrobili w mój program inicjuje urządzenia Direct3D. Jestem całkowicie zaskoczony tym, co robię źle. Starałem się czytać tyle, ile mogę na temat msdn o tym, ale nic nie pomogło mi dowiedzieć się, co idzie źle. Zgodnie z MSDN, biorę do odpowiednich etapów:
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.
jestem dość pewny ja wypełnienie opisu tekstury zbyt poprawnie.
Czy problem może wynikać z mojej inicjalizacji urządzeń d3d? Czy niewłaściwie używam funkcji mapy? Czy nie dostarczyłem wystarczających informacji ogólnych? Jakieś pomysły na to, co się dzieje?
Informacje dodatkowe: Podczas próby zmapowania danych do stałego bufora dla mojego procesora wierzchołków pojawia się ten sam błąd "zasób już zmapowany". Ponadto przetestowałem go na innym komputerze i uzyskałem te same problemy z odwzorowaniem.
Aktualizacja: Pobrałem kod samouczka dla D3D11 i wziąłem mój kod do tworzenia tekstury i odwzorowania i zapisałem go zaraz po zakończeniu kodu samouczka, inicjalizując d3d. Chciałem tylko sprawdzić, czy dostanę błąd mapowania. Zgodnie z oczekiwaniami nie otrzymałem błędu "zasób już zmapowany". Co więcej, kiedy skopiuję kod inicjalizacyjny d3d z samouczka i zastępuję go moim, nadal otrzymuję zasób już zmapowany błąd, który nawet myli mnie jeszcze bardziej, ponieważ wszystko, co robię przed zainicjowaniem d3d, tworzy okno.
Problem polega na dwukrotnym uruchomieniu funkcji. Powinieneś to zrobić: HRESULT hr = (x); jeśli (NIEPOWODZENIE (h)) – notabene