Hello.
I'm using DirectXTK for texture creation from *.dds. Thought documentation says that DDSTextureLoader supports texture arrays, I couldn't figure out how to create an array. So I'm loading textures with D3DReadFileToBlob() and creating texture from it with CreateDDSTextureFromMemory(). And now interesting part - this code works fine:
CreateDDSTextureFromMemory(device, static_cast<uint8_t*>(textureBlob1->GetBufferPointer()), textureBlob1->GetBufferSize(), texture.ReleaseAndGetAddressOf(), nullptr);
D3D11_TEXTURE2D_DESC texElementDesc;
texture->GetDesc(&texElementDesc);
D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
viewDesc.Format = texElementDesc.Format;
viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
viewDesc.Texture2D.MostDetailedMip = 0;
viewDesc.Texture2D.MipLevels = 1;
hr = device->CreateShaderResourceView(texture.Get(), &viewDesc, textureView.ReleaseAndGetAddressOf());
But this is only single texture. Let's change it for an array:
CreateDDSTextureFromMemory(device, static_cast<uint8_t*>(textureBlob1->GetBufferPointer()), textureBlob1->GetBufferSize(), texture.ReleaseAndGetAddressOf(), nullptr);
D3D11_TEXTURE2D_DESC texElementDesc;
texture->GetDesc(&texElementDesc);
D3D11_TEXTURE2D_DESC texArrayDesc;
texArrayDesc.Width = texElementDesc.Width;
texArrayDesc.Height = texElementDesc.Height;
texArrayDesc.MipLevels = 1;
texArrayDesc.ArraySize = 1;
texArrayDesc.Format = texElementDesc.Format;
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;
D3D11_SUBRESOURCE_DATA resourceData1{};
resourceData1.pSysMem = static_cast<uint8_t*>(textureBlob1->GetBufferPointer());
resourceData1.SysMemPitch = texElementDesc.Width * sizeof(uint8_t) * 4;
resourceData1.SysMemSlicePitch = texElementDesc.Width * texElementDesc.Height * sizeof(uint8_t) * 4;
ComPtr<ID3D11Texture2D> texArray;
hr = device->CreateTexture2D(&texArrayDesc, &resourceData1, texArray.ReleaseAndGetAddressOf());
D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
viewDesc.Format = texArrayDesc.Format;
viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
viewDesc.Texture2DArray.MostDetailedMip = 0;
viewDesc.Texture2DArray.MipLevels = 1;
viewDesc.Texture2DArray.FirstArraySlice = 0;
viewDesc.Texture2DArray.ArraySize = 1;
hr = device->CreateShaderResourceView(texArray.Get(), &viewDesc, &textureView);
And, as you might guess, this doesn't work. Actually this work, but somewhat strange - some textures looks cutted, some become fully transparent. Personally me think that the problem is here:
D3D11_SUBRESOURCE_DATA resourceData1{};
resourceData1.pSysMem = static_cast<uint8_t*>(textureBlob1->GetBufferPointer());
resourceData1.SysMemPitch = texElementDesc.Width * sizeof(uint8_t) * 4;
resourceData1.SysMemSlicePitch = texElementDesc.Width * texElementDesc.Height * sizeof(uint8_t) * 4;
I know there's a way to update texture with context's update sub resource. But I'm interested in initializing texture on creation.