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