I would like to set a slice of a Texture2DArray as a render target in D3D/DirectX11. It's not clear how to do this.

What I'm looking for is the DirectX equivalent of glFramebufferTextureLayer(), which sets a slice of a GL_TEXTURE_2D_ARRAY_EXT as a texture resource of a Framebuffer Object.

In D3D11, you set a render target using ID3D11DeviceContext::OMSetRenderTargets, and you can set a Texture2DArray resource view as a render target. However, the only way I see to select which slice of the texture is painted is to use the SV_RenderTargetArrayIndex semantic in an HLSL geometry shader. (The semantic is only available in a geometry shader).

My pipeline doesn't have a geometry shader, and I don't know at compile time which primitive type I will be rendering - I'm reading models out of input files. It seems like, to add a passthrough geometry shader I would need one shader program for every possible primitive type (terrible).

The desired output slice will not change between rendering passes. Is there no way to set a slice of a Texture2DArray as a render target without using a geometry shader?


1 Answer 1


You can create separate render target views for every slice and then set it using ID3D11DeviceContext::OMSetRenderTargets.

desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
desc.Texture2D.MipSlice = D3D11CalcSubresource(0, arraySlice, mipLevels);

Information about subresources.

  • \$\begingroup\$ Yup, that works. Thanks! edit: what I actually did was create an array of Texture2DArray targets, with the start slice set to the i'th slice: RenderTarget = new ID3D11RenderTargetView*[targets]; for(USHORT i=0;i<targets; i++) { srtDesc.Format = sTexDesc.Format; srtDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; srtDesc.Texture2DArray.MipSlice = 0; srtDesc.Texture2DArray.ArraySize = 1; srtDesc.Texture2DArray.FirstArraySlice = i; hr = m_pd3dDevice->CreateRenderTargetView(m_pInputView, &srtDesc, &RenderTarget[i]); } \$\endgroup\$
    – matth
    Jul 25, 2011 at 17:24

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .