Direct3D地图像素黑色

时间:2016-08-22 17:59:20

标签: c++ unity3d direct3d11

我试图使用direct3d将像素数据作为字节数组映射到动态纹理,由于某种原因,所得到的像素数据是黑色的并且不会被转移。我之前使用updatesubresource直接转换了这段代码,但现在使用map / unmap。

ID3D11Texture2D* d3dtex = (ID3D11Texture2D*)textureHandle;
assert(d3dtex);

ID3D11DeviceContext* ctx = NULL;
m_Device->GetImmediateContext(&ctx);
D3D11_MAPPED_SUBRESOURCE mappedResource;
ZeroMemory(&mappedResource, sizeof(D3D11_MAPPED_SUBRESOURCE));

//    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.
ctx->Unmap(d3dtex, 0);

1 个答案:

答案 0 :(得分:2)

您没有检查HRESULT功能的ID3D11DeviceContext::Map返回。可能,纹理无法映射。 D3D11中的纹理可能无法映射的原因有多种,最明显的是它不是使用D3D11_CPU_ACCESS_WRITE访问标志创建的(当您在调用{{1}时使用D3D11_MAP_WRITE时})。如果强行使用D3D11调试层,调试输出将打印出有关失败的详细消息。

如果您依赖于映射Unity内部创建的纹理,则不应该假设它是可映射的。无论使用什么标志创建纹理,使用Map(正如您使用的)都可以更广泛地兼容。您可以使用UpdateSubresource查询纹理上的CPUAccessFlags,并决定使用哪种更新方法(映射/更新)。