Vulkan多子通道渲染通道中图像布局配置方向确认
背景信息
以延迟渲染器为例,它可能包含以下图像附件列表:
0: depth 1: swapchain 2: position 3: normal 4: albedo 5: resolve
以及以下绑定了对应附件的子通道:
0: [0, 2, 3, 4] 1: [0, 5] 2: [0, 1]
在此配置下,图像2、3、4在第一个子通道中需要处于VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL布局,之后需转换为VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL以在第二个子通道中使用。
我了解可通过VkSubpassDependency实现隐式布局转换,也明白VkSubpassDescription::pColorAttachments中的VkAttachmentReference::layout是该子通道所需的布局。我该如何创建VkSubpassDescription来实现这一点?
尝试方案
我当前的伪代码尝试如下:
descriptions := vector<VkSubpassDescription> for each subpass in subpasses { references:= std::vector<VkAttachmentReference> depth_attachment := optional<int> for each attachment in image_attachments { if attachment is depth: depth_attachment = attachment.binding continue } reference := VkAttachmentReference reference.attachment = attachment.binding reference.layout = contains(subpass.attachments, attachment) ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL references.push_back(reference) } descriptions.push_back(create_description(VK_PIPELINE_BIND_POINT_GRAPHICS, references, depth_attachment) }
其中create_description用于创建VkSubpassDescription,并可选填充VkSubpassDescription::pDepthStencilAttachment
问题
该配置的问题在于,未在第一个子通道中使用的附件与VkAttachmentDescription::loadOp设为VK_ATTACHMENT_LOAD_OP_CLEAR存在冲突,因为这些附件处于VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL布局,无法被写入。
疑问
我对核心概念的理解是否正确?这种多子通道渲染通道的实现方向是否正确?
补充说明
我了解VkSubpassDescription::pInputAttachments可能有助于解决部分问题,但在添加处理后期特效的子通道时无用,因为输入附件仅能查询当前片段的x, y, layer。
内容的提问来源于stack exchange,提问作者Symlink

