Direct3D 11:如何访问 CPU 端内存中的多维数据集映射人脸(ID3D11DeviceContext::Map

Direct3D 11: How to access cube map faces in memory on the CPU side (should ID3D11DeviceContext::Map work with subresources?)?

本文关键字:数据集 映射 ID3D11DeviceContext Map 何访问 访问 Direct3D CPU 内存      更新时间:2023-10-16

我目前正在尝试在 Direct3D 11 中读取立方体映射的面,但它没有像我预期的那样工作:我希望使用 ID3D11DeviceContext::Map(( 作为子资源访问每个人脸(如 D3D11CalcSubresource(( 或 (MipSlice + (ArraySlice * MipLevels((,但这仅适用于第一张脸,而对所有其他人脸都失败。

我的问题是:

  1. 这应该有效,还是立方体映射面与用于计算子资源的数组切片有根本的不同? 很可能还有其他一些错误导致子资源无法正确复制到 CPU 可读(可映射(暂存纹理,其他事情也可能出错。 我只是想确定甚至可以在花费大量时间尝试在错误的假设下调试它之前访问立方体映射面作为子资源。
  2. 无论这是否应该有效,有没有更好的方法来读取 CPU 端的立方体贴图面? 例如,立方体贴图面是否保证在内存中是连续的? 如果是这样,是否有可能(和定义的行为(使用指针数学来使用指向第一个人脸的指针来读取所有人脸? 否则,是否有其他方法更适合在 CPU 端读取立方体映射内存?

我无法想象 Direct3D 11 旨在使阅读立方体地图无法在不将所有 6 个面重新渲染到新的呈现目标(拼接在一起(的情况下,所以我希望了解 D3D11 的人知道如何做到这一点。 我已经查看了 MSDN 文档,但它没有太多帮助,因为子资源上的页面和 Map 上的页面都没有提到立方体映射:http://msdn.microsoft.com/en-us/library/windows/desktop/ff476901%28v=vs.85%29.aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/ff476457%28v=vs.85%29.aspx

谢谢!

立方体贴图与 2D 纹理数组没有什么不同;事实上,在引擎盖下它们是完全相同的。允许使用 Map,并且应类似于以下内容:

//pD3DContext - Initialized and valid ID3D11DeviceContext*
//pCubeMap - Initialized and valid ID3D11Texture2D*
//uiFace - Valid index between 0 and 5 referring to the cube map face
//Texel - C++ type representing the underlying pixel format of the cube map
int i=D3D11CalcSubresource(0,uiFace,1);
D3D11_MAPPED_SUBRESOURCE mappedResource={0};
pD3DContext->Map(pCubeMap,i,D3D11_MAP_DISCARD,0,&mappedResource);
Texel* data=(Texel*)mappedResource.pData;
//Do something with data

需要注意的一点是,立方体贴图应使用 D3D11_TEXTURE2D_DESC::MiscFlags 中设置的D3D11_RESOURCE_MISC_TEXTURECUBE选项创建,并且ID3D11ShaderResourceView还应指定D3D11_SRV_DIMENSION_TEXTURECUBE选项。但是,如果您决定渲染到资源(即创建立方体贴图的ID3D11RenderTargetView(,则可能需要将资源作为纹理的 2D 数组进行访问。

要确保的一件事是,从文件中读入的数据以正确的格式提供。立方体地图应该是连续的内存块,其中一个面的结尾是下一个面的开始。此外,需要考虑任何自定义 mipmap,因为这些都出现在立方体地图的下一个面之前。如果您的数据以这种方式加载,那么我认为没有太多不正确的地方。

这包含有关 Direct3D 11 中的多维数据集映射的一些信息,并且有一些小片段散落在有关 D3D11 中纹理的文档页面中。