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?)?
我目前正在尝试在 Direct3D 11 中读取立方体映射的面,但它没有像我预期的那样工作:我希望使用 ID3D11DeviceContext::Map(( 作为子资源访问每个人脸(如 D3D11CalcSubresource(( 或 (MipSlice + (ArraySlice * MipLevels((,但这仅适用于第一张脸,而对所有其他人脸都失败。
我的问题是:
- 这应该有效,还是立方体映射面与用于计算子资源的数组切片有根本的不同? 很可能还有其他一些错误导致子资源无法正确复制到 CPU 可读(可映射(暂存纹理,其他事情也可能出错。 我只是想确定甚至可以在花费大量时间尝试在错误的假设下调试它之前访问立方体映射面作为子资源。
- 无论这是否应该有效,有没有更好的方法来读取 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 中纹理的文档页面中。
- 如何实现高效的算法来计算大型数据集的多个不同值?
- HDF5Cpp 扩展复合数据集超板问题
- HDF5 简单读取数据集失败
- std::bad_alloc 在大数据集的 Dijkstra 计算期间
- C++中的多维数据集:从 std::vector 的 2D 数据到 std::vector 的 2D 网格的最干净方法?
- C++创建空 HDF5 文件而不是数据集的代码
- 跨线程共享数据集与拆分每个线程的数据
- 多维数据集ai中的ai_float是什么
- 适用于频繁更改的大型数据集的最佳数据结构
- 将数据集从 R 传递到C++(使用 .呼叫)
- 将数据集几乎平均分配给工作线程
- 我将 c++ 矢量数据集转换为 c 数组.我将相同的数据集传递到一个应该给出相同输出的函数中
- 使用 194 点海伦数据集训练 DLib 形状预测器
- 现代 OpenGL 多维数据集旋转未按预期工作
- 数据集(和样本)何时在 boost::test 中销毁?
- 从数据集 Blob 字段中打开和编辑文件
- openGL-testure映射多维数据集失败
- Direct3D 11:如何访问 CPU 端内存中的多维数据集映射人脸(ID3D11DeviceContext::Map
- glGenerateMipmap中的GL_INVALID_OPERATION(不完整的多维数据集映射)
- 哪个向量和映射,使用更少的内存(大的数据集和未知的大小)