Render to Texture2DArray slices in DirectX11?(转自GAMEDEV)

来源:互联网 发布:手机淘宝首页尺寸大小 编辑:程序博客网 时间:2024/05/18 02:12
5down vote favorite

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

2down voteaccepted

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

D3D11_RENDER_TARGET_VIEW_DESC desc;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

share|improve this answer
 
 
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]); } –  matth Jul 25 '11 at 17:24
0 0