在Vulkan API中对于渲染通道的理解感到困惑

9

最近我开始学习Vulkan API,有些主题让我感到困惑,我的问题是什么是渲染通道,为什么它要与命令缓冲记录同时使用?最后,什么是子通道,子通道依赖关系和附件?这些与渲染通道通常相关。


“Concurrently” 是什么意思? - krOoze
1
你的问题太宽泛了。这就像问“什么是纹理”或“描述渲染管线”。我可以写三篇博客文章来介绍渲染通道系统和架构。 - Nicol Bolas
@krOoze 我不确定这是否是正确的术语,我的意思是它通常与命令缓冲记录一起使用。 - BulBul
@Nicol Bolas,我理解编写图形程序所需的大部分术语和阶段,例如我知道交换链及其目的、帧缓冲等等,但对于渲染通道,我有点困惑,它是一个更高的范围,包含命令缓冲记录吗?一个简单的类比可能会帮助我更好地理解它。 - BulBul
@BulBul:“对于渲染通道,我有点困惑”。我理解你的感受,但这并没有缩小你问题的范围。它仍然基本上是“向我解释规范的第七章”。此外,如果你能理解 Vulkan 中的“帧缓冲”,为什么不能理解渲染通道呢?除非你说的不是 VkFramebuffer 对象。 - Nicol Bolas
@Nicol Bolas,我曾经使用过OpenGL,但是没有记录命令和指定渲染通道的功能,所有命令都是通过一个函数调用直接执行的(我知道它是隐式处理的),但那时我并没有深入研究它。 - BulBul
1个回答

22

这是获取绘图的唯一方式(绘制指令只能在渲染通道内部执行)。所以不要想得太多。作为初学者,你只需要创建一个渲染通道和一个(强制性的)子通道即可。你可以稍后了解其深度。


此外,您应该给予所有那些写得比在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依赖项)之间的管线屏障的等效物。子通道以任意顺序执行,可以重叠(由驱动程序自行决定),除非您在依赖项中描述了它们(或以其他方式同步)。
在命令缓冲区中使用vkCmdBeginRenderPass(),您创建渲染通道实例(render pass instance)(提供附件的实际图像和写入它们的实际命令)。
渲染通道描述的部分会自动执行(图像布局转换、屏障和MSAA分辨率)。
对于其余部分,您需要为当前CB的渲染通道实例的子通道记录命令。您按顺序为子通道0、1、2、3、4 ... 记录命令——但这不是实际的执行顺序——您已经用子通道依赖项描述了它。否则,由驱动程序决定。

然后,带有这种渲染通道实例的命令缓冲区被提交到队列并实际执行。
也许正是这些间接引用使人们难以理解。命令在执行之前就已经被记录下来了。而渲染通道在被记录之前就已经被创建了。 :)


只是为了确保我理解正确,渲染通道是一种将所有部分/块组合在一起的蓝图,当提交命令到命令队列时,预期的图像将通过引用此蓝图绘制。如果您能给我一个更好的比喻来说明渲染通道,那么一切都会更清楚。 - BulBul
我们正在进入一个危险的误导隐喻的领域。我在回答中试图表达一个观点,即您不一定需要理解它才能使用它。就像量子物理学一样。关键是您提供每个命令所需的内容,它就会正常工作。 - krOoze
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - krOoze
谢谢您的帮助,我会查看您提供给我的链接并尽力更好地理解。 - BulBul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接