我目前正在尝试在Direct3D 11中阅读多维数据集地图的面孔,但它并没有像我期望的那样工作:我希望使用ID3D11DeviceContext :: Map()来访问每个面作为子资源(如D3D11CalcSubresource()或(MipSlice +(ArraySlice * MipLevels)),但这仅适用于第一个面,而不适用于所有其他面。
我的问题是:
我无法想象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
谢谢!
答案 0 :(得分:3)
立方体贴图与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_RESOURCE_MISC_TEXTURECUBE
中设置的D3D11_TEXTURE2D_DESC::MiscFlags
选项创建多维数据集地图,ID3D11ShaderResourceView
也应指定D3D11_SRV_DIMENSION_TEXTURECUBE
选项。但是,如果您决定渲染资源,则可能需要将资源作为2D纹理数组访问(即创建立方体贴图的ID3D11RenderTargetView
)。
要确保的一件事是您从文件中读取的数据是以正确的格式提供的。立方体贴图应该是一个连续的内存块,其中一个面的末端是下一个面的开头。此外,需要考虑任何自定义mipmap,因为这些都位于立方体贴图的下一个面之前。如果您的数据已经以这种方式加载,那么我无法想到的其他内容是不正确的。
This包含有关Direct3D 11中立方体贴图的一些信息,并且在D3D11中有关纹理的文档页面中散布着一些小部分。