Direct3D 贴图像素黑色

Direct3D Map Pixels Black

我正在尝试使用 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);

您没有检查 ID3D11DeviceContext::Map 函数中的 HRESULT return。可能无法映射纹理。 D3D11 中的纹理可能无法映射的原因有多种,最明显的是它不是使用 D3D11_CPU_ACCESS_WRITE 访问标志创建的(当您在调用 [=14= 时使用 D3D11_MAP_WRITE ]).如果您强制启用 D3D11 调试层,调试输出将打印出有关失败的详细消息。

如果您依赖映射 Unity 内部创建的纹理,则不应假设它是可映射的。使用 UpdateSubresource (正如您所使用的那样)具有更广泛的兼容性,无论使用什么标志来创建纹理。您可以使用 ID3D11Texture2D::GetDesc 查询纹理上的 CPUAccessFlags,并决定使用哪种更新方法 (map/update)。