对 Vulkan 中的渲染过程感到困惑 API
confused about render pass in Vulkan API
最近开始学习Vulkan API,有一些话题让我很困惑,我的问题是什么是render pass,为什么要和command buffer recording同时使用?最后什么是 sub pass、sub pass dependencies 和 attachments?通常与渲染过程相关。
这是绘制内容的唯一方法(绘制命令只能在渲染过程中)。所以不要想太多。作为初学者,您只需要创建一个渲染通道和一个(强制性)子通道即可。后面你就可以了解其中的深度了。
此外,您应该给所有这些视频和教程一些机会,这些视频和教程的篇幅很长,而且比有人在这里以简短的 SO 格式编写的任何内容都更加谨慎。
给出spec a chance (it's not so bad — but avoids redundant semantic and conceptual information). Try to read up some intro by AMD, vulkan-tutorial.com, Vulkan in 30 minutes (this one helped me started anyway — well there was not much more available at the time), API without secrets and watch e.g. Vulkan GDC session Part1, Part2。
现在你听到了背后的一些人,看到了一些命令。您应该向我们提供您不了解的更具体方面。
好的,我只是在这里添加一些概念性的描述来正式回答这个问题。
Render pass 是某种图形作业的描述或地图或方案(围绕特定的 organization/use 图像资源)。但它没有描述实际命令或实际资源(在 render pass instance vkCmdBeginRenderPass()
和 vkCmdEndRenderPass()
之间的命令缓冲区记录中完成)
也许您稍后提供实施的 "black box" 或 "C++ like declaration" 是一个很好的类比。
渲染通道有一些附件。让我们将它们视为所需帧图像输出和临时图像的描述(但不是特定帧图像本身)。
渲染通道有一些子通道。 Subpass 描述附件在执行期间将如何处理(例如,作为彩色图像布局中的颜色缓冲区)。
渲染通道有一些子通道依赖关系。依赖关系描述了子通道之间的执行顺序(它形成了一个依赖 DAG)。依赖性还描述了两个子通道之间或子通道与整个渲染通道外部之间的管线屏障的等效项(VK_SUBPASS_EXTERNAL
依赖性)。子通道以任何顺序执行并且可以重叠(在 driver 的空闲时间),除了您在依赖项中描述的内容(或以其他方式同步)。
在使用 vkCmdBeginRenderPass()
的命令缓冲区中,您创建 render pass 实例 (您为带有 VkFramebuffer
的附件提供实际图像,以及写入到的实际命令他们)。
渲染过程描述中的内容会自动执行(图像布局转换、屏障和 MSAA 分辨率)。
对于其余部分,您将记录当前 CB 的 renderpass 实例的子通道的命令。您按顺序为子通道 0、1、2、3、4、...执行此操作 — 即 而不是 尽管实际执行顺序是什么 — 您已经使用子通道依赖项描述了它(否则就是有空了driver)。
然后将具有此类渲染通道实例的命令缓冲区提交到队列并实际执行。
或许正是这些间接性使其更难掌握。命令甚至在执行之前就被记录下来。甚至在记录之前就创建了渲染通道。 :)
最近开始学习Vulkan API,有一些话题让我很困惑,我的问题是什么是render pass,为什么要和command buffer recording同时使用?最后什么是 sub pass、sub pass dependencies 和 attachments?通常与渲染过程相关。
这是绘制内容的唯一方法(绘制命令只能在渲染过程中)。所以不要想太多。作为初学者,您只需要创建一个渲染通道和一个(强制性)子通道即可。后面你就可以了解其中的深度了。
此外,您应该给所有这些视频和教程一些机会,这些视频和教程的篇幅很长,而且比有人在这里以简短的 SO 格式编写的任何内容都更加谨慎。
给出spec a chance (it's not so bad — but avoids redundant semantic and conceptual information). Try to read up some intro by AMD, vulkan-tutorial.com, Vulkan in 30 minutes (this one helped me started anyway — well there was not much more available at the time), API without secrets and watch e.g. Vulkan GDC session Part1, Part2。
现在你听到了背后的一些人,看到了一些命令。您应该向我们提供您不了解的更具体方面。
好的,我只是在这里添加一些概念性的描述来正式回答这个问题。
Render pass 是某种图形作业的描述或地图或方案(围绕特定的 organization/use 图像资源)。但它没有描述实际命令或实际资源(在 render pass instance vkCmdBeginRenderPass()
和 vkCmdEndRenderPass()
之间的命令缓冲区记录中完成)
也许您稍后提供实施的 "black box" 或 "C++ like declaration" 是一个很好的类比。
渲染通道有一些附件。让我们将它们视为所需帧图像输出和临时图像的描述(但不是特定帧图像本身)。
渲染通道有一些子通道。 Subpass 描述附件在执行期间将如何处理(例如,作为彩色图像布局中的颜色缓冲区)。
渲染通道有一些子通道依赖关系。依赖关系描述了子通道之间的执行顺序(它形成了一个依赖 DAG)。依赖性还描述了两个子通道之间或子通道与整个渲染通道外部之间的管线屏障的等效项(VK_SUBPASS_EXTERNAL
依赖性)。子通道以任何顺序执行并且可以重叠(在 driver 的空闲时间),除了您在依赖项中描述的内容(或以其他方式同步)。
在使用 vkCmdBeginRenderPass()
的命令缓冲区中,您创建 render pass 实例 (您为带有 VkFramebuffer
的附件提供实际图像,以及写入到的实际命令他们)。
渲染过程描述中的内容会自动执行(图像布局转换、屏障和 MSAA 分辨率)。
对于其余部分,您将记录当前 CB 的 renderpass 实例的子通道的命令。您按顺序为子通道 0、1、2、3、4、...执行此操作 — 即 而不是 尽管实际执行顺序是什么 — 您已经使用子通道依赖项描述了它(否则就是有空了driver)。
然后将具有此类渲染通道实例的命令缓冲区提交到队列并实际执行。
或许正是这些间接性使其更难掌握。命令甚至在执行之前就被记录下来。甚至在记录之前就创建了渲染通道。 :)