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 pipline 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?


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 http://msdn.microsoft.com/en-us/library/ff476901%28v=vs.85%29.aspx

  • \$\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 '11 at 17:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.