c++ - OMSetRenderTargets 只呈现第一个提供的目标

标签 c++ directx

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

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

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

根据我在 targets 数组中首先指定的参数,将被渲染。另一个渲染目标 View 将不会被渲染。

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

如果我将 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;
}

关于c++ - OMSetRenderTargets 只呈现第一个提供的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28859063/

相关文章:

c++ - 这个for循环的时间复杂度是多少(和 `n`有关)?

c++ - Visual Studio std::array 初始值设定项错误 (2797)

c++ - VC++ : Weird compiler errors

c++ - 类成员函数地址

windows - 渲染透明窗口

c++ - IMFTransform::ProcessInput() "The buffer was too small to carry out the requested action."

c++ - 堆栈是如何初始化的?

c++ - 如何在运行时更改 styleSheet 属性?

c++ - 如何在可变参数包中扩展 vector 或数组?

c++ - 如何重置我的 DirectX 9 设备?