2016-08-22 153 views
2

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

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); 

回答

2

你是不是检查从ID3D11DeviceContext::Map功能HRESULT回报。可能,纹理无法映射。 D3D11中的纹理可能无法映射的原因有几个,最明显的是它不是用D3D11_CPU_ACCESS_WRITE访问标志创建的(当您在拨打Map时使用D3D11_MAP_WRITE)。如果您在D3D11调试层上强制执行,则调试输出将打印出关于失败的详细消息。

如果您依赖的是映射Unity内部创建的纹理,则不应认为它是可映射的。使用UpdateSubresource(正如您使用的)更广泛地兼容,无论使用哪种标志来创建纹理。您可以使用ID3D11Texture2D::GetDesc来查询纹理上的CPUAccessFlags,并决定使用哪种更新方法(地图/更新)。