当前位置: 首页 > 知识库问答 >
问题:

如何在Vulkan中“混合”ImGui框架与场景渲染

卓学智
2023-03-14

我不是Vulkan方面的专家。我想知道如何在常规场景渲染的顶部显示Vulkan帧(提交每帧记录的especif commandBuffer以绘制UI更改)。所以在本例中,我有两个renderPasses,一个用于场景,另一个用于ImGui,还有两个commandBuffers。在尝试发送这两个commandBuffers时,只显示最后一个,因为它们使用的是swapchain映像。我错过了什么?imgui过程中的帧缓冲区视图附件是否应该是swapchainImage?

共有1个答案

苏彦君
2023-03-14

如果您将场景和UI渲染分成不同的不同渲染通道,您需要告诉第一个渲染通道的颜色附件以保留内容,而第二个渲染通道UI加载帧缓冲区的内容。

从您的描述判断,第二次渲染通过正确设置为VK_ATTACHMENT_LOAD_OP_CLEAR对于loadOp,这会导致帧缓冲区在您开始第二次渲染时立即用当前的清晰颜色清除。

因此,在您的场景中,您需要在第一次传递中存储内容,以确保不会由于优化而丢弃这些内容:

std::array<VkAttachmentDescription, 2> attachments = {};
// Attachment 0 = Color attachment
attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
...

在第二次渲染过程中,需要将其设置为加载以前的内容:

std::array<VkAttachmentDescription, 2> attachments = {};
// Attachment 0 = Color attachment
attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
...

如果提交多个命令缓冲区,还需要通过使用适当的同步原语(如信号量或管道屏障)(例如通过renderpass的子过程隐式)来确保正确的命令顺序。

另一种可能更简单的方法(取决于您的设置)是简单地将UI渲染添加到与场景渲染相同的命令缓冲区中。这样您只需在场景几何之上渲染您的UI而无需同步。尽管这可能不是所有用例的选项。或者您可以使用子通道,包括(重)渲染通道。

 类似资料:
  • 我有一个使用和的项目。我正在尝试更新到每个的最新版本,但我遇到了问题(它们最后一次更新是在2020年2月左右)。 要初始化我正在调用的两个库,请执行以下操作: 然后我将一些对象添加到三个场景中: 并调用一个更新循环,如下所示: 更新到这些库的最新版本后,我遇到了场景中的对象没有按预期呈现的问题。 例如,我将2个添加到场景中,但由于某种原因只显示一个。此外,如果在场景中切换不同对象的可见性,例如切换

  • 我正在通过glfw3库学习OpenGL,我正在使用imgui制作一个有趣的应用程序。 我想做一个小引擎或CAD工具。 问题是我不能在imgui窗口中呈现我想要的。 我搜索了谷歌,找到了以下链接: https://gamedev.stackexchange.com/questions/150214/render-in-a-imgui-window https://gamedev.stackexcha

  • 本文向大家介绍MyBatis 框架适用场合相关面试题,主要包含被问及MyBatis 框架适用场合时的应答技巧和注意事项,需要的朋友参考一下 MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。 对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis 将是 不错的选择

  • 当以下转换在将RDD写入文件之前执行时,它们之间有什么区别? 聚结(1,洗牌=true) 合并(1,洗牌=假) 代码示例: 它与collect()相比如何?我完全知道Spark save方法将以HDFS风格的结构存储它,但我更感兴趣的是collect()和shuffled/non shuffled coalesce()的数据分区方面。

  • 处理注释 mixin 的杰克逊代码是否可以由第三方重用来混合非杰克逊注释? 处理混合蛋白的核心杰克逊类是什么?

  • 如何使亲爱的ImGui创建的窗口完全适合“背景”?我的意思是当我们创建一个窗口时,它也在一些渲染场景或背景中。我想模仿Qt等其他框架创建的窗口,使其更像桌面应用程序,而不仅仅是在一些游戏中。