gpt4 book ai didi

c++ - Direct3D 11:如何在 CPU 端访问内存中的立方体贴图面(ID3D11DeviceContext::Map 应该使用子资源吗?)?

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:14 26 4
gpt4 key购买 nike

我目前正在尝试读取 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.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ff476457%28v=vs.85%29.aspx

谢谢!

最佳答案

立方体贴图与二维纹理阵列没有区别;事实上,在引擎盖下它们是完全一样的。允许使用 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),则可能需要以二维纹理数组的形式访问该资源。

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

This包含有关 Direct3D 11 中的立方体贴图的一些信息,并且在 D3D11 中有关纹理的文档页面中散布着一些小片段。

关于c++ - Direct3D 11:如何在 CPU 端访问内存中的立方体贴图面(ID3D11DeviceContext::Map 应该使用子资源吗?)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27222618/

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