我试图使用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);
答案 0 :(得分:2)
您没有检查HRESULT
功能的ID3D11DeviceContext::Map
返回。可能,纹理无法映射。 D3D11中的纹理可能无法映射的原因有多种,最明显的是它不是使用D3D11_CPU_ACCESS_WRITE
访问标志创建的(当您在调用{{1}时使用D3D11_MAP_WRITE
时})。如果强行使用D3D11调试层,调试输出将打印出有关失败的详细消息。
如果您依赖于映射Unity内部创建的纹理,则不应该假设它是可映射的。无论使用什么标志创建纹理,使用Map
(正如您使用的)都可以更广泛地兼容。您可以使用UpdateSubresource
查询纹理上的CPUAccessFlags
,并决定使用哪种更新方法(映射/更新)。