使用 CopyResource() 更新绑定到 Direct3D 交换链的缓冲区时,是否需要设置相应的主呈现器目标视图?

When updating a buffer bound to a Direct3D swapchain using CopyResource(), does the corresponding main render target view need to be set?

提问人:rbaleksandar 提问时间:10/20/2023 更新时间:10/20/2023 访问量:36

问:

我有两个纹理,它们都分配给单独的 RTV:

  • texture_rgb- 分配给我的主 RTV(我与 .它是通过从我的交换链调用创建的swapchain->Present(...)GetBuffer()
  • texture_extra- 分配给单独的 RTV。纹理和 RTV 都是相同的(在配置方面),最大的区别是这里的这个是手动创建的,而不是由交换链创建的。

我正在将我的场景渲染为 ,我正在以某种方式修改其内容(例如更改某些纹素的值)。然后,我继续复制空 .然后,交换链显示结果。texture_extraCopyResource(texture_rgb, texture_extra)texture_rgb

将纹理的内容复制到另一个纹理的内容是否取决于在触发复制之前是否为目标 RTV 调用了内容?OMSetRenderTargets(...)

伪代码(渲染帧函数):

// Switch to main RTV
device_context->OMSetRenderTargets(1, &rtv, dsv);
// Clear buffers
device_context->ClearRenderTargetView(rtv, color);
device_context->ClearDepthStencilView(dsv, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);

// Switch to extra RTV
device_context->OMSetRenderTargets(1, &rtv_extra, dsv); // DSV is the depth stencil view used by all RTVs
// Clear buffers
device_context->ClearRenderTargetView(rtv_extra, color);
device_context->ClearDepthStencilView(dsv, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
// Set constant buffer and shaders
...
// Draw
device_context->DrawIndexed(36, 0, 0);
// Process rendered scene further
...

// Copy result to main <--------------- DO I NEED TO SWITCH TO MAIN RTV HERE?
device_context->CopyResource(texture_rgb, texture_extra);

// Switch back to main RTV
device_context->OMSetRenderTargets(1, &rtv, dsv);
// Present
swapchain->Present(1, 0);
C++ DirectX-11 Direct3D Direct3D11

评论


答:

2赞 mrvux 10/20/2023 #1

CopyResource 不依赖于资源的分配位置,因此无需将资源分配给 rtv 即可执行复制。

此外,如果您不在交换链上绘制,而只是使用 copy resource 进行 blit,则调用:

device_context->CopyResource(texture_rgb, texture_extra);

// This is not necessary unless you still want to draw something on the swapchain
device_context->OMSetRenderTargets(1, &rtv, dsv);
// Present
swapchain->Present(1, 0);