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

vyswwuz2  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(86)

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

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

我正在将场景渲染为texture_extra,我正在以某种方式修改其内容(例如,改变一些纹理元素的值)。然后我继续使用CopyResource(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);
whitzsjs

whitzsjs1#

CopyResource不依赖于资源分配的位置,因此不需要将资源分配给rtv即可执行复制。
此外,如果您不在交换链上绘制,而是仅使用复制资源进行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);

相关问题