방금 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에 따르면, 나는 적절한 단계를 복용하고 있습니다 :
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를 초기화하기 전에 모든 작업을 수행하기 때문에 창을 작성하기 때문입니다.
문제는이 기능을 두 번 실행하는 것입니다. 당신은 그것을해야합니다 : HRESULT hr = (x); if (FAILED (hr)) – notabene