Render to Cubemap
Comparing to render to texture 2d, creating a cubemap as render target is similar with minor difference.
A texture 2d desc will be used for texture creation. When creating a cubemap, ArraySize must be 6 and MiscFlags should be D3D11_RESOURCE_MISC_TEXTURECUBE.
D3D11_TEXTURE2D_DESC cubeTexDesc; cubeTexDesc.Width = 256; cubeTexDesc.Height = 256; cubeTexDesc.MipLevels = 1; cubeTexDesc.ArraySize = 6; cubeTexDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; cubeTexDesc.SampleDesc.Count = 1; cubeTexDesc.SampleDesc.Quality = 0; cubeTexDesc.Usage = D3D11_USAGE_DEFAULT; cubeTexDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; cubeTexDesc.CPUAccessFlags = 0; cubeTexDesc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE;
RRenderer.D3DDevice()->CreateTexture2D(&cubeTexDesc, 0, &cdb.Buffer);
We need six render target views, each of them need a D3D11_RTV_DIMENSION_TEXTURE2DARRAY as ViewDimension. To create render target view for each side, Texture2DArray.FirstArraySlice should be set to the face id.
D3D11_RENDER_TARGET_VIEW_DESC cubeRTVDesc; cubeRTVDesc.Format = cubeTexDesc.Format; cubeRTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; cubeRTVDesc.Texture2DArray.ArraySize = 1; cubeRTVDesc.Texture2DArray.MipSlice = 0; for (int i = 0; i < 6; i++) { cubeRTVDesc.Texture2DArray.FirstArraySlice = i; RRenderer.D3DDevice()->CreateRenderTargetView(cdb.Buffer, &cubeRTVDesc, &cdb.View[i]); }
Then we create a shader resource view with ViewDimention set to D3D11_SRV_DIMENSION_TEXTURECUBE
D3D11_SHADER_RESOURCE_VIEW_DESC cubeSRVDesc; cubeSRVDesc.Format = cubeRTVDesc.Format; cubeSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; cubeSRVDesc.TextureCube.MipLevels = 1; cubeSRVDesc.TextureCube.MostDetailedMip = 0; RRenderer.D3DDevice()->CreateShaderResourceView(cdb.Buffer, &cubeSRVDesc, &cdb.SRV);
Similarly, create texture2d, 6 render target views and shader resource view for depth buffer with D3D11_BIND_DEPTH_STENCIL in BindFlags and format as a depth buffer compatible format.
To render to cubemap, set up six cameras at a view point with 90 degree FOV and each camera looks at one axis direction.
Setup render target view and depth stencil view and render all six directions into the cube map.











