我试图使用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);
您没有检查函数的HRESULT
返回ID3D11DeviceContext::Map
值。可能无法映射纹理。D3D11中的纹理可能不可映射的原因有很多,最明显的是它不是使用D3D11_CPU_ACCESS_WRITE
访问标志创建的(当您D3D11_MAP_WRITE
在调用中使用时Map
)。如果强制D3D11调试层,则调试输出将打印出有关失败的详细消息。
如果您依赖于映射内部创建的Unity纹理,则不应假定它是可映射的。UpdateSubresource
无论您使用了什么标志来创建纹理,使用(就像您以前使用的一样)具有更广泛的兼容性。您可以CPUAccessFlags
使用来查询纹理上的ID3D11Texture2D::GetDesc
,并确定要使用的更新方法(映射/更新)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句