Im trying to map pixel data as a byte array to a dynamic texture using direct3d, for some reason the resulting pixel data is black and its not getting transfered. I have converted this code directly from using updatesubresource before, but now im using map/unmap.
ID3D11Texture2D* d3dtex = (ID3D11Texture2D*)textureHandle;
ID3D11DeviceContext* ctx = NULL;
// Disable GPU access to the vertex buffer data.
ctx->Map(d3dtex, 0, D3D11_MAP_WRITE, 0, &mappedResource);
// Update the vertex buffer here.
memcpy(mappedResource.pData, dataPtr, textureWidth * textureHeight * 4);
// Reenable GPU access to the vertex buffer data.
You are not checking the
HRESULT return from the
ID3D11DeviceContext::Map function. Likely, the texture cannot be mapped. There are several reasons why a texture in D3D11 might not be mappable, the most obvious is that it was not created with the
D3D11_CPU_ACCESS_WRITE access flag. If you force on the D3D11 debug layer, the debug output will print out a detailed message about the failure.
If you are relying on mapping a Unity internally created texture, you should not assume it is mappable. Using
UpdateSubresource (as you were using) is more widely compatible, regardless of what flags were used to create the texture. You could query the
CPUAccessFlags on the texture, using
ID3D11Texture2D::GetDesc, and decide which update method to use (map/update).