最近我开始学习Vulkan API,有些主题让我感到困惑,我的问题是什么是渲染通道,为什么它要与命令缓冲记录同时使用?最后,什么是子通道,子通道依赖关系和附件?这些与渲染通道通常相关。
这是获取绘图的唯一方式(绘制指令只能在渲染通道内部执行)。所以不要想得太多。作为初学者,你只需要创建一个渲染通道和一个(强制性的)子通道即可。你可以稍后了解其深度。
此外,您应该给予所有那些写得比在SO上简短的内容更加详细和用心的视频和教程一些机会。
给规范一个机会(它并不那么糟糕——但避免了冗余的语义和概念信息)。尝试阅读AMD的一些介绍, vulkan-tutorial.com, 30分钟内了解Vulkan(这个帮助我开始了——当时没有更多的资源),无秘密API,并观看例如Vulkan GDC session Part1, Part2。
现在你听到了一些人对此的看法,并且看到了一些命令。如果您还有不理解的具体方面,请与我们联系。
好的,我将在这里添加一些概念性描述,以正式回答问题。
渲染过程(Render pass)是一个图形作业的描述、映射或方案(其围绕特定的图像资源组织/使用),但它不描述实际的命令或实际的资源(在vkCmdBeginRenderPass()
和vkCmdEndRenderPass()
之间进行渲染过程实例(Render pass instance)的命令缓冲记录中完成)。
也许可以将其类比为“黑匣子”或“C++声明”,您稍后再提供实现。
渲染过程(Render pass)具有一些附件(attachments)的集合。 让我们把它们看作所需帧图像输出和临时描述(但不是具体的帧图像本身)。
渲染过程(Render pass)具有一些子过程(subpasses)的集合。 子过程描述了在其执行期间如何处理附件(例如,作为颜色图像布局中的颜色缓冲器)。
渲染通道具有一组子通道依赖项(dependencies)。依赖项描述了子通道之间的执行顺序(形成依赖DAG)。依赖项还描述了两个子通道之间或一个子通道与整个渲染通道之外(VK_SUBPASS_EXTERNAL依赖项)之间的管线屏障的等效物。子通道以任意顺序执行,可以重叠(由驱动程序自行决定),除非您在依赖项中描述了它们(或以其他方式同步)。然后,带有这种渲染通道实例的命令缓冲区被提交到队列并实际执行。
也许正是这些间接引用使人们难以理解。命令在执行之前就已经被记录下来了。而渲染通道在被记录之前就已经被创建了。 :)
VkFramebuffer
对象。 - Nicol Bolas