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

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

  _devcon->OMSetRenderTargets( 2, targets, nullptr );


根据我在targets数组中首先指定的参数,将被呈现。其他渲染目标视图将不会渲染。

我用IDXGISwapChain标志创建了D3D11_CREATE_DEVICE_DEBUG,但看不到与此功能相关的任何错误消息。

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

为什么OMSetRenderTargets似乎只求第一个targets元素?

编辑:

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

我想渲染为16位无符号图像,因此我将DXGI_FORMAT_R16G16B16A16_UNORM用于纹理。
对于后缓冲,我需要使用适合屏幕显示的其他格式,因此我使用DXGI_FORMAT_R16G16B16A16_FLOAT

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

最佳答案

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

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;
}

10-08 03:23