子流程和附着引用
一个渲染流程可以包含多个子流程。子流程依赖于上一流程处理后的帧缓冲内容。比如,许多叠加的后期处理效果就是在上一次的处理结果上进行的。我们将多个子流程组成一个渲染流程后,Vulkan可以对其进行一定程度的优化。对于我们这个渲染三角形的程序,我们只使用了一个子流程。
每个子流程可以引用一个或多个附着,这些引用的附着是通过VkAttachmentReference结构体指定的:
VkAttachmentReference colorAttachmentRef = {};
colorAttachmentRef.attachment = 0;
colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
attachment成员变量用于指定要引用的附着在附着描述结构体数组中的索引。在这里,我们的VkAttachmentDescription数组只包含了一个附着信息,所以将attachment指定为0即可。layout成员变量用于指定进行子流程时引用的附着使用的布局方式,Vulkan会在子流程开始时自动将引用的附着转换到layout成员变量指定的图像布局。我们推荐将layout成员变量设置为VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,一般而言,它的性能表现最佳。
我们使用VkSubpassDescription结构体来描述子流程:
VkSubpassDescription subpass = {};
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
Vulkan在未来也可能会支持计算子流程,所以,我们还需要显式地指定这是一个图形渲染的子流程。接着,我们指定引用的颜色附着:
subpass.colorAttachmentCount = 1;
subpass.pColorAttachments = &colorAttachmentRef;
这里设置的颜色附着在数组中的索引会被片段着色器使用,对应我们在片段着色器中使用的 layout(location = 0) out vec4 outColor语句。 下面是其它一些可以被子流程引用的附着类型:
-
pInputAttachments:被着色器读取的附着
-
pResolveAttachments:用于多重采样的颜色附着
-
pDepthStencilAttachment:用于深度和模板数据的附着
-
pPreserveAttachments:没有被这一子流程使用,但需要保留数据的附着