如何停止清除命令缓冲区之间的内容?

我正在尝试使ImGui在我的引擎中工作,但是在将其“覆盖”在我的立方体网格上时遇到了一些麻烦。我将这两个分别放在单独的命令缓冲区中,例如

std::array<VkCommandBuffer,2> cmdbuffers = { commandBuffers[imageIndex],imguicmdbuffers[imageIndex] };

然后在我的队列提交信息中,我将命令缓冲区计数设置为2并像这样将数据传递给它

submitInfo.commandBufferCount = 2;
submitInfo.pCommandBuffers = cmdbuffers.data();

但是现在发生的是它仅呈现imgui,或者如果我在数组中切换顺序,则仅呈现多维数据集,而不会两者都呈现。是否因为它们共享相同的渲染过程?我将VkRenderPassBeginInfo透明颜色更改为仔细检查,实际上它要么清除黄色并绘制图像,要么清除红色并绘制立方体。我尝试将清除Alpha设置为0,但这不起作用,而且无论如何似乎都是一种hack。我感觉好像不了解它如何提交和执行命令缓冲区以及如何将其与渲染通道/帧缓冲区绑定在一起,所以怎么了?

chinawangsir 回答:如何停止清除命令缓冲区之间的内容?

给出以下陈述(即假设它们是正确的):

  •   

    它们共享相同的渲染通行证

  •   

    在队列提交信息中,我将命令缓冲区数设置为2

  •   

    VkRenderPassBeginInfo清除颜色

关于渲染性质的某些事情变得显而易见(您未直接声明或提供代码的事情)。首先,您将两个单独的命令缓冲区直接提交到队列。只能将主命令缓冲区提交到队列。

第二,根据渲染过程的性质,渲染过程实例不能跨越主要命令缓冲区。因此,您必须具有两个渲染通道实例。

第三,您指定在开始渲染过程实例时可以更改图像的透明颜色。因此,渲染过程必须指定将图像作为加载操作清除。

从所有这些方面,我得出的结论是,您两次开始同一个VkRenderPass。如前所述,在渲染过程实例的开始处将渲染过程设置为清除图像。这将尽职尽责地发生两次,其中第二次将预先擦除渲染到该图像的所有内容。

基本上,您有两个渲染操作,使用一个渲染通道,该渲染通道被设置为将先前任何渲染操作创建的数据销毁到它使用的图像。那是行不通的。

您有几种解决方法。

我的首选方法是开始使用辅助命令缓冲区。我不知道是否可以给ImGui一个CB来记录其数据。但是,如果可以的话,我建议将其记录到辅助CB中。然后,您可以在渲染通道的相应子通道中执行该辅助CB。因此,您无需提交两个主要的CB;您只提交一个。

或者,您可以制作一个新的VkRenderPass,它不会清除先前的图像;它应该改为加载图像数据。您的第二个渲染操作将使用该渲染过程,而最初的渲染过程将保留清晰的加载操作。

在最坏的情况下,您可以将第二个操作渲染为完全不同的图像,然后在第三个渲染操作中将其与主图像合并。

本文链接:https://www.f2er.com/3163164.html

大家都在问