创建渲染过程
译者注:示例代码点击此处
渲染(绘制几何图形)只能在渲染过程中执行。当我们还想执行其他操作(如图像后处理或准备几何图形和光预处理数据)时,需要将这些操作排序到子组中。为此,我们指定所有必需附件的描述、将操作分组到其中的所有子组以及这些操作之间必需的依赖关系。准备好此数据后,可以创建渲染过程。
做好准备...
为了减少需要提供的参数数量,在本节中,我们使用SubpassParameters类型的自定义结构(请参阅指定子过程描述)。
怎么做...
1.创建一个名为attachments_descriptions的std::vector <VkAttachmentDescription> 类型变量,其中我们指定所有渲染过程附件的描述(请参阅指定附件描述内容)。
2.准备一个名为subpass_descriptions的std::vector <VkSubpassDescription>类型变量,并使用它来定义子过程的描述(请参阅指定子过程描述内容 )。
3.创建一个行为subpass_dependencies的std :: vector <VkSubpassDependency>类型变量,为需要在渲染过程中定义的每个依赖项添加一个新成员到此向量(请参阅指定子过程之间的依赖关系内容)。
4.创建名为render_pass_create_info的VkRenderPassCreateInfo类型变量,并使用以下值初始化其成员:
·sType为VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
·pNext为nullptr
·flags为0
·attachmentCount为attachments_descriptions矢量中的元素数量
·pAttachments为指向attachments_descriptions向量的第一个元素的指针(如果为空,则为nullptr值)
·subpassCount为subpass_descriptions中的元素数量
·pSubpasses为为指向subpass_descriptions的第一个元素的指针
·dependencyCount为subpass_dependencies中的元素数量
·pDependencies为指向subpass_dependencies向量的第一个元素的指针(如果为null,则为nullptr值)
5.获取应为其创建渲染过程的逻辑设备的句柄。 将其存储在名为logical_device的VkDevice类型的变量中。
6.创建一个名为render_pass的VkRenderPass类型的变量,其中将存储创建的渲染过程(render pass)的句柄。
7.调用vkCreateRenderPass(logical_device, &render_pass_create_info, nullptr, &render_pass)。 提供logical_device变量,指向render_pass_create_info变量的指针,nullptr值和指向render_pass变量的指针。
8.通过检查它是否返回VK_SUCCESS值来确保调用成功。
这个怎么运作...
渲染过程定义了有关如何在其所有子过程中执行的操作使用附件的一般信息。 这允许驱动程序优化工作并提高应用程序的性能。
渲染过程创建的最重要部分是数据准备 - 所有使用的附件和子过程的描述以及子过程之间依赖关系的规范(请参阅指定附件描述,指定子过程描述和指定子过程之间的依赖关系的依赖关系)。 这些步骤简称如下:
SpecifyAttachmentsDescriptions( attachments_descriptions );
std::vector<VkSubpassDescription> subpass_descriptions;
SpecifySubpassDescriptions( subpass_parameters, subpass_descriptions );
SpecifyDependenciesBetweenSubpasses( subpass_dependencies );
当我们为创建渲染过程的函数指定参数时,将使用此数据:
VkRenderPassCreateInfo render_pass_create_info = {
VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
nullptr,
0,
static_cast<uint32_t>(attachments_descriptions.size()),
attachments_descriptions.data(),
static_cast<uint32_t>(subpass_descriptions.size()),
subpass_descriptions.data(),
static_cast<uint32_t>(subpass_dependencies.size()),
subpass_dependencies.data()
};
VkResult result = vkCreateRenderPass( logical_device, &render_pass_create_info, nullptr, &render_pass );
if( VK_SUCCESS != result ) {
std::cout << "Could not create a render pass." << std::endl;
return false;
}
return true;
但是为了正确执行绘图操作,渲染过程是不够的,因为它只指定操作如何排序到子过程以及如何使用附件。 没有关于这些附件使用的图像的信息。 有关用于所有已定义附件的特定资源的此类信息存储在帧缓冲区中。