【发布时间】:2021-02-16 20:51:07
【问题描述】:
我试图重现与此视频类似的结果:https://www.youtube.com/watch?v=21UsMuFTN0k 具体来说,我想将整个场景渲染为不同的纹理,并将纹理放入 UI 中,就像视频的截图一样:@987654322 @
视频的作者正在使用 OpenGL 来执行此操作,而我试图在 Vulkan 中实现它。但是,由于我当前的程序使用第三个附件来启用 MSAA 并使用辅助命令缓冲区渲染整个场景,因此我很难将视频中执行此操作的方式转换为 Vulkan。我想我可能不仅需要更多的帧缓冲区,还需要多个渲染通道。简而言之,到目前为止,这是我尝试过的:
- 开始第一个渲染通道,渲染通道开始信息设置为较小的渲染区域、屏幕外渲染通道和单独的帧缓冲区。
- 将屏幕外渲染通道和帧缓冲区传递给继承信息,并将其传递给辅助命令缓冲区以进行绘制。
- 结束第一个渲染过程。
- 开始第二个渲染通道,将渲染通道开始信息设置为屏幕的实际大小、主渲染通道和主帧缓冲区。
- 将第二个渲染通道和帧缓冲区传递给继承信息,并将其传递给辅助命令缓冲区以进行绘制。
- 做
vkCmdExecuteCommands。 - 结束第二个渲染过程。
- 结束命令缓冲区。
然而,当程序执行时,验证层显示:
vkCmdExecuteCommands(): Cannot duplicate VkCommandBuffer 0x1c26226d2e8[] in pCommandBuffers without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set. The Vulkan spec states: If any element of pCommandBuffers was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, it
must not appear more than once in pCommandBuffers
这是否意味着我必须为所有辅助命令缓冲区设置VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT?或者有其他方法可以纠正吗?因为据我所知,设置VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT 有性能成本。
此外,如果我尝试在每个渲染通道中执行 vkExecuteCommands,验证层将显示命令缓冲区已被破坏。
我想知道在 Vulkan 中重现类似结果的正确方法是什么,以及我是否必须将它们分开以便我必须多次执行 vkQueueSubmit。
【问题讨论】:
标签: graphics 3d rendering vulkan framebuffer