【问题标题】:Rendering multiple objects with different textures, vertex buffers, and uniform values in Vulkan在 Vulkan 中渲染具有不同纹理、顶点缓冲区和统一值的多个对象
【发布时间】:2018-09-02 01:21:33
【问题描述】:

我的背景是 OpenGL,我正在尝试学习 Vulkan。我在设置一个类时遇到了一点麻烦,所以我可以用不同的纹理、顶点缓冲区和 UBO 值渲染多个对象。我遇到了一个问题,我的两个图像被绘制,但它们闪烁和交替。我认为这一定是由于在绘图调用之后呈现图像。有没有办法延迟图像的呈现?或者在呈现之前将不同的图像合并在一起?我的代码可以在这里找到,我希望这足以让有人了解我正在尝试做什么:https://gitlab.com/cwink/Ingin/blob/master/ingin.cpp

谢谢!

【问题讨论】:

  • 如果您认为这是演示文稿的问题,请阅读此(以及以下)教程:software.intel.com/en-us/articles/…
  • 但是您似乎正确地同步了渲染和演示。验证层是否会生成任何错误消息?

标签: vulkan


【解决方案1】:

您每帧调用两次render。而render 调用vkQueuePresentKHR,显然你的两个渲染是交替的。

您可以通过延迟vkQueuePresentKHR 呼叫来延迟演示。假设您要显示每张图像约 1 秒。您可以在每次 render 通话后简单地 std::this_thread::sleep_for (std::chrono::seconds(1));。 (可能不是最好的方法,但只是为了了解您的问题所在。)

vkQueuePresentKHR为你做任何“合并”。通常,您只需首先将它们绘制到相同的交换链VkImage 中,然后将其呈现一次即可“合并图像”。

【讨论】:

  • 在同一个 vkImage 中绘制作为单独的渲染通道将不起作用,因为他清除了作为加载操作的颜色附件。
  • @ratchetfreak 概括地说。我认为必须完成的工作才能完成。例如。为此具有单个渲染通道。我希望我的 A 足以让 OP 摒弃他的一些错误假设和成见。
  • @krOoze 谢谢你的回答,你的意思是有一个单独的渲染通道只是为了清除,然后另一个没有清除来绘制对象?我也不确定这是否会 100% 工作,因为我正在尝试使用 MVP 将图像转换为不同的坐标,并且似乎统一数据与正在绘制的图像相关联。
  • @CodyWink 我的意思是上述评论中所有内容的单个渲染通道作为示例。但这是一个实现细节;实现相同目标的许多方法...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 2012-04-24
  • 1970-01-01
  • 2018-03-23
  • 2021-02-16
  • 1970-01-01
相关资源
最近更新 更多