现在,我想进行后期处理并使用子通道方式来完成它。我创建了两个子通道,并在第二个子通道的屏幕上绘制一个大三角形。
但问题是我不知道如何获得第一个子通道的渲染结果,因为我需要将它提供给第二个子通道的片段着色器,然后我可以在片段着色器中做一些效果第二个子通道。
我猜结果是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
。
我想方式是错的。
如何为下一个子通道获取正确的渲染结果?
答案 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;可以通过区域"依赖(除非您正在阅读以前的子通道中写的其他内容)。