【问题标题】:Direct3D Map Pixels BlackDirect3D 地图像素黑色
【发布时间】:2016-08-25 23:41:41
【问题描述】:

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

【问题讨论】:

    标签: c++ unity3d direct3d11


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-16
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多