最近我开始学习Vulkan API,有些主题让我困惑,我的问题是什么是渲染过程,为什么它与命令缓冲区记录同时使用?什么是子传递,子传递依赖和附件?通常与渲染传递有关。
答案 0 :(得分:11)
这是绘制内容的唯一方法(绘制命令只能在渲染过程中)。所以不要过分思考它。作为一个初学者,您只需要创建一个带有一个(强制)子通道的渲染通道即可。您可以稍后了解它的深度。
此外,您应该给所有这些视频和教程提供一些机会,这些视频和教程的编写时间比任何人在这里以简短的SO格式编写的内容更加谨慎。
给spec一个机会(它不是那么糟糕 - 但避免冗余的语义和概念信息)。试着阅读some intro by AMD,vulkan-tutorial.com,Vulkan in 30 minutes(这个帮助我开始了 - 当时没有更多可用的东西),API without secrets并观看,例如Vulkan GDC会话Part1,Part2。
现在你听到了一些人,看到了一些命令。您应该回到我们面前,了解更多您不了解的具体方面。
好的,我只是在这里添加一些概念性的描述来正式回答这个问题。
渲染过程是一种描述或地图或图形作业的方案(围绕图像资源的特定组织/使用)。但它没有描述实际命令和实际资源(在vkCmdBeginRenderPass()
和vkCmdEndRenderPass()
之间渲染传递实例的命令缓冲区记录中完成
也许是一个"黑匣子"或" C ++如声明"您稍后提供的实现是一个很好的比喻。
渲染过程有一些附件。让我们将它们视为所需帧图像输出和临时图像的描述(但不是特定帧图像本身)。
渲染过程有一些子通道。子通道描述了附件在执行过程中的处理方式(例如,作为彩色图像布局中的颜色缓冲区)。
Render pass有一些subpass 依赖项。依赖关系描述了子通道之间的执行顺序(它形成了依赖关系DAG)。依赖性还描述了两个子通道之间或者整个渲染通道(VK_SUBPASS_EXTERNAL
依赖关系)的子通道和外部之间的管道障碍的等效物。子路径以任何顺序执行,并且可以重叠(在驱动程序的闲暇时),除了您在依赖项中描述的内容(或以其他方式同步)。
在使用vkCmdBeginRenderPass()
的命令缓冲区中,您可以创建渲染传递实例(为VkFramebuffer
提供附件的实际图像,以及写入它们的实际命令。)
渲染过程描述中的内容会自动执行(图像布局过渡,障碍和MSAA分辨率)。
对于其余部分,您将记录当前CB的renderpass实例的子通道的命令。你按顺序执行子通道0,1,2,3,4,...... - 不实际执行顺序是什么 - 你已经用子通道依赖描述了(否则)是司机的闲暇时间。)
然后将具有此类渲染过程实例的命令缓冲区提交到队列并实际执行 也许这些方向使得它更难以掌握。命令在执行之前被记录。并且甚至在记录之前创建渲染过程。 :)