C++ OMSetRenderTargets仅渲染第一个提供的目标

C++ OMSetRenderTargets仅渲染第一个提供的目标,c++,directx,C++,Directx,我正在尝试同时渲染到多个ID3D11RenderTargetView。 但似乎只有第一个目标被渲染: ID3D11RenderTargetView* targets [ 2 ] = { _backbuffer , _renderToTextureRTV }; _devcon->OMSetRenderTargets(

我正在尝试同时渲染到多个
ID3D11RenderTargetView
。 但似乎只有第一个目标被渲染:

  ID3D11RenderTargetView* targets [ 2 ] = { _backbuffer
                                          , _renderToTextureRTV
                                          };

  _devcon->OMSetRenderTargets( 2, targets, nullptr );
将根据我在
目标
数组中首先指定的参数进行渲染。将不会渲染其他渲染目标视图

我使用
D3D11\u create\u DEVICE\u DEBUG
标志创建我的
IDXGISwapChain
,并且看不到与此功能相关的任何错误消息

如果将
nullptr
指定为第一个
targets
元素,则可以重现相同的问题。在这种情况下,将不渲染第二个元素。 但是如果我指定
nullptr
作为第二个元素,第一个元素将被正确渲染

为什么
OMSEtranderTargets
似乎只评估第一个
目标
元素

编辑:

我实际上想要实现的是同时渲染到backbuffer和纹理。我需要渲染到纹理,因为我希望能够从CPU访问像素值

我想渲染为16位无符号图像,因此我对纹理使用
DXGI_格式\u R16G16B16A16_UNORM
。 对于backbuffer,我需要使用适合屏幕显示的不同格式,因此我使用
DXGI_格式\u r16g16a16_浮点


出于性能原因,我不想在两者之间进行元素转换,这就是我有两个渲染目标的原因。

您的像素着色器与此类似吗?需要手动设置像素着色器输出到的渲染目标:

struct Output 
{
  float4 target0 : SV_Target0;
  float4 target1 : SV_Target1;
};

Output PixelShader(float4 pos : SV_Position)
{
  Output output;

  output.target0 = float4(1.0, 0, 0, 0); //Output to the first rendertarget
  output.target1 = float4(0, 1.0, 0, 0); //Output to the second rendertarget

  return output;
}

在像素着色器中,是否将任何内容输出到SV_Target1(即第二个绑定渲染目标)。