如何在Vulkan中获取下一个子通道的渲染结果?

时间:2018-01-20 08:00:49

标签: graphics 3d vulkan

现在,我想进行后期处理并使用子通道方式来完成它。我创建了两个子通道,并在第二个子通道的屏幕上绘制一个大三角形。

但问题是我不知道如何获得第一个子通道的渲染结果,因为我需要将它提供给第二个子通道的片段着色器,然后我可以在片段着色器中做一些效果第二个子通道。

我猜结果是swapchain_imageView。但我不能用它。 Vulkan告诉我这一点 Cannot use image 0x8 with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the actual current layout VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL。 我想方式是错的。

如何为下一个子通道获取正确的渲染结果?

2 个答案:

答案 0 :(得分:3)

你想要一个带有子通道附件引用和依赖关系的renderpass,如下所示:

pSubpasses = [
  {
    pInputAttachments = [],
    pColorAttachments = [{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}]
  },
  {
    pInputAttachments = [{0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL}]
    pColorAttachments = [{1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}]
  }
]

pDependencies = [
  {
    0, 1,
    VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
    VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
    VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
    VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
    VK_DEPENDENCY_BY_REGION_BIT,
  }
]

在第二个子通道中,您还需要使用VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT描述符将附件0中的图像绑定到片段着色器。

在着色器中,输入附件的用法如下:

layout (input_attachment_index=i, set=m, binding=n) uniform subpassInput inputAttachment;
vec4 fragment = subpassLoad(inputAttachment);

答案 1 :(得分:0)

您无法随意读取当前作为渲染通道附件的任何图像。请注意,我说"渲染传递",而不是" subpass"。启动渲染过程图像后,对于任何未明确表示附件操作的操作,这些图像都是禁止的。

如果您的后期处理效果只需要对图像的每个纹素进行读取/修改/写入操作,如果它不需要读取相邻像素才能完成其工作,那么您可以使用图像作为输入附件。这将适用于色调映射等效果。

但是如果你确实需要从渲染图像中访问多个纹素,那么这个后处理效果必须存在于与创建它的单独的渲染过程实例中。

此外:

  

因为我在子通道2中设置了inputAttachment,我想系统应该自动将子通道1的渲染结果发送到子通道2的片段着色器。

你"猜测"?这是Vulkan;没有"猜测"这里。除非你告诉系统这些操作之间存在依赖关系,否则就不会有。因此,试图从中读取是UB。

如果子通道2要读取子通道1写入的输入附件,那么必须将子通道从子通道1放置到子通道2.最好使用& #34;可以通过区域"依赖(除非您正在阅读以前的子通道中写的其他内容)。