Sorry, kauna, I am doing a project, so it is very sensitive. By the way, how do you destroy temporary variables when you create a texture 2D array?. Because I always meet a memory problem:
//*/
//---------------------------------------------------------------------------------------
// Load all textures into Texture2D array with D3DX11CreateTextureFromFile
//---------------------------------------------------------------------------------------
UINT iNumOfMaterials = g_sFileNames.size();
vector<ID3D11Texture2D*> pTexture2Ds;
pTexture2Ds.resize(iNumOfMaterials);;
for (int i=0; i<iNumOfMaterials; i++)
{
D3DX11_IMAGE_LOAD_INFO loadInfo;
loadInfo.Width = resolution;
loadInfo.Height = resolution;
loadInfo.Depth = 0;
loadInfo.FirstMipLevel = 0;
loadInfo.MipLevels = 0;
loadInfo.Usage = D3D11_USAGE_STAGING;
loadInfo.BindFlags = 0;
loadInfo.CpuAccessFlags = D3D10_CPU_ACCESS_WRITE | D3D10_CPU_ACCESS_READ;
loadInfo.MiscFlags = 0;
loadInfo.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
loadInfo.Filter = D3DX11_FILTER_NONE;
loadInfo.MipFilter = D3DX11_FILTER_NONE;
loadInfo.pSrcInfo = 0;
hr = D3DX11CreateTextureFromFile(pd3dDevice, g_sFileNames[i].c_str(),
//&loadInfo, 0, (ID3D11Resource**)&pTexture2Ds[i], 0);
&loadInfo, 0, &pTexture2Ds[i], 0);
}
//---------------------------------------------------------------------------------------
// Create the texture array. Each element in the texture
// array has the same format/dimensions.
//---------------------------------------------------------------------------------------
D3D11_TEXTURE2D_DESC texElementDesc;
pTexture2Ds[0]->GetDesc(&texElementDesc);
D3D11_TEXTURE2D_DESC texArrayDesc;
texArrayDesc.Width = texElementDesc.Width;
texArrayDesc.Height = texElementDesc.Height;
texArrayDesc.MipLevels = texElementDesc.MipLevels;
texArrayDesc.ArraySize = iNumOfMaterials;
texArrayDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
texArrayDesc.SampleDesc.Count = 1;
texArrayDesc.SampleDesc.Quality = 0;
texArrayDesc.Usage = D3D11_USAGE_DEFAULT;
texArrayDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
texArrayDesc.CPUAccessFlags = 0;
texArrayDesc.MiscFlags = 0;
ID3D11Texture2D* texArray = 0;
hr = pd3dDevice->CreateTexture2D( &texArrayDesc, 0, &texArray);
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
// Copy individual texture elements into texture array.
//---------------------------------------------------------------------------------------
// for each texture element...
ID3D11DeviceContext* pd3dImmediateContext;
pd3dDevice->GetImmediateContext(&pd3dImmediateContext);
for(UINT i = 0; i < g_sFileNames.size(); ++i)
{
// for each mipmap level...
for(UINT j = 0; j < texElementDesc.MipLevels; ++j)
{
D3D11_MAPPED_SUBRESOURCE MappedResource;
hr = pd3dImmediateContext->Map( pTexture2Ds[i], j, D3D11_MAP_READ, 0, &MappedResource ) ;
pd3dImmediateContext->UpdateSubresource(texArray, D3D11CalcSubresource(j, i, texElementDesc.MipLevels), 0, MappedResource.pData, MappedResource.RowPitch, 0);
pd3dImmediateContext->Unmap(pTexture2Ds[i], j);
}
}
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
// Create a resource view to the texture array.
//---------------------------------------------------------------------------------------
D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
viewDesc.Format = texArrayDesc.Format;
viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
viewDesc.Texture2DArray.MostDetailedMip = 0;
viewDesc.Texture2DArray.MipLevels = texArrayDesc.MipLevels;
viewDesc.Texture2DArray.FirstArraySlice = 0;
viewDesc.Texture2DArray.ArraySize = iNumOfMaterials;
hr = pd3dDevice->CreateShaderResourceView(texArray, &viewDesc, &g_pTextureArray);
//---------------------------------------------------------------------------------------
SAFE_RELEASE(texArray);
for (int i=0; i<pTexture2Ds.size(); i++)
SAFE_RELEASE(pTexture2Ds[i]);
I release all temporary variables: texArray and all pTexture2Ds except g_pTextureArray, which is used for binding to PS shader.