gpt4 book ai didi

c++ - Direct3D 贴图像素黑色

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:06 24 4
gpt4 key购买 nike

我试图使用 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。可能无法映射纹理。 D3D11 中的纹理可能无法映射的原因有多种,最明显的是它不是使用 D3D11_CPU_ACCESS_WRITE 访问标志创建的(当您在调用 Map)。如果强制启用 D3D11 调试层,调试输出将打印出有关失败的详细消息。

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

关于c++ - Direct3D 贴图像素黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39085897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com