开始渲染过程
译者注:示例代码点击此处
当我们创建了渲染过程和帧缓冲区并且我们准备开始记录渲染几何所需的命令时,我们必须记录开始渲染过程的操作。 这也是
自动启动其第一个子过程。
怎么做...
1.获取存储在名为command_buffer的VkCommandBuffer类型的变量中的命令缓冲区的句柄。 确保命令缓冲区处于记录状态。
2.用渲染过程的句柄初始化名为render_pass的VkRenderPass类型的变量。
3.使用与render_pass兼容的帧缓冲区。 将其句柄存储在名为framebuffer的VkFramebuffer类型的变量中。
4.指定在渲染过程中将限制渲染的渲染区域的尺寸。 此区域不能大于为帧缓冲区指定的大小。 将维度存储在名为render_area的VkRect2D类型的变量中。
5.创建一个名为clear_values的std::vector<VkClearValue>类型变量,其元素数等于渲染过程中的附件数。 对于使用clear loadOp的每个渲染过程附件,请在与附件索引相同的索引处提供相应的clear值。
6.准备名为subpass_contents的VkSubpassContents类型的变量,描述如何记录第一个子过程中的操作。 如果直接记录命令并且不执行辅助命令缓冲区,则使用VK_SUBPASS_CONTENTS_INLINE值;或者使用VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS值指定子过程的命令存储在辅助命令缓冲区中,并且仅使用执行辅助命令缓冲区命令(请参阅第9章命令记录和绘图中的主命令缓冲区配方中执行辅助命令缓冲区内容)。
7.创建一个名为render_pass_begin_info的VkRenderPassBeginInfo类型的变量,并使用以下值初始化其成员:
·sType为VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO
·pNext为nullptr
·renderPass为render_pass
·framebuffer为framebuffer
·renderArea为render_area
·clearValueCount为clear_values元素数量
·pClearValues为指向clear_values向量的第一个元素的指针(如果为空,则为nullptr值)
8.调用vkCmdBeginRenderPass( command_buffer, &render_pass_begin_info, subpass_contents ),提供command_buffer变量,指向render_pass_begin_info变量指针和subpass_contents变量。
这个怎么运作...
启动渲染过程会自动启动其第一个子过程。 在此之前,清除所有指定了明确loadOp的附件 - 用单一颜色填充, 用于清除的值(以及启动渲染过程所需的其余参数)在VkRenderPassBeginInfo类型的变量中指定:
VkRenderPassBeginInfo render_pass_begin_info = {
VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
nullptr,
render_pass,
framebuffer,
render_area,
static_cast<uint32_t>(clear_values.size()),
clear_values.data()
};
具有清除值的数组必须具有相同数量的元素,以便它们可以对应于从开始到最后清除的附件(具有最大索引的附件被清除)。 与渲染过程中的附件具有相同数量的清除值更安全, 如果没有清除附件,我们可以为clear values数组提供nullptr值。
当我们开始渲染过程时,还需要提供渲染区域的尺寸。 它可以与帧缓冲区的尺寸一样大,但可以更小。 我们需要确保渲染将限制在指定区域,否则此范围之外的像素可能会变得不确定。
要开始渲染过程,我们需要调用:
vkCmdBeginRenderPass( command_buffer, &render_pass_begin_info, subpass_contents );