我正在尝试使ImGui在我的引擎中工作,但是在将其“叠加”到我的立方体网格上时遇到了一些麻烦。我将两个分开分开的命令缓冲区
std::array<VkCommandBuffer, 2> cmdbuffers = { commandBuffers[imageIndex], imguicmdbuffers[imageIndex] };
然后在我的队列提交信息中,我将命令缓冲区计数设置为2并将数据传递给它,如下所示
submitInfo.commandBufferCount = 2;
submitInfo.pCommandBuffers = cmdbuffers.data();
但是现在发生的是它仅呈现imgui,或者如果我在数组中切换顺序,则仅呈现多维数据集,而不会两者都呈现。是否因为它们共享相同的渲染过程?我将VkRenderPassBeginInfo
透明颜色更改为仔细检查,实际上它要么清除黄色并绘制图像,要么清除红色并绘制立方体。我尝试将清除Alpha设置为0,但这是行不通的,而且无论如何似乎都是一种hack。我感觉我不了解它如何提交和执行命令缓冲区以及如何将其与渲染通道/帧缓冲区绑定在一起,那么怎么办?
给定以下语句(即假设它们是正确的):
他们共享相同的渲染通道
在我的队列提交信息中,我将命令缓冲区数设为2
VkRenderPassBeginInfo清除颜色
有关渲染性质的某些事情变得显而易见(您未直接声明或提供代码的事情)。首先,将两个单独的命令缓冲区直接提交到队列。只能将主命令缓冲区提交到队列。
其次,根据渲染过程的性质,渲染过程实例不能跨越主要命令缓冲区。因此,您必须具有两个渲染通道实例。
第三,您指定可以在开始渲染过程实例时更改图像的透明颜色。因此,渲染过程必须指定将图像作为加载操作清除。
综上所述,我得出的结论是您要开始VkRenderPass
两次相同的操作。如先前所推导的,渲染通道设置为清除渲染通道实例开始处的图像。这将尽职尽责地发生两次,其中第二次将预先擦除渲染到该图像的所有内容。
基本上,您有两个渲染操作,使用一个渲染通道,该通道设置为将以前任何渲染操作创建的数据销毁到它使用的图像。那是行不通的。
您有几种解决方法。
我的首选方法是开始使用辅助命令缓冲区。我不知道是否可以给ImGui一个CB来记录其数据。但是,如果可以的话,我建议将其记录到辅助CB中。然后,您可以将该次CB执行到渲染通道的适当子通道中。因此,您无需提交两个主要的CB;您只提交一个。
另外,您可以制作一个VkRenderPass
不会清除先前图像的新图像。它应该加载图像数据。您的第二个渲染操作将使用该渲染过程,而您的第一个渲染操作将保留明晰的加载操作。
最坏的情况是,您可以让第二个操作渲染为完全不同的图像,然后在第三个渲染操作中将其与主图像合并。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句