开始渲染流程

调用vkCmdBeginRenderPass函数可以开始一个渲染流程。这一函数需要我们使用VkRenderPassBeginInfo结构体来指定使用的渲染流程对象:

VkRenderPassBeginInfo renderPassInfo = {};
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
renderPassInfo.renderPass = renderPass;
renderPassInfo.framebuffer = swapChainFramebuffers[i];

renderPass成员变量用于指定使用的渲染流程对象,framebuffer成员变量用于指定使用的帧缓冲对象。

renderPassInfo.renderArea.offset = {0, 0};
renderPassInfo.renderArea.extent = swapChainExtent;

renderArea成员变量用于指定用于渲染的区域。位于这一区域外的像素数据会处于未定义状态。通常,我们将这一区域设置为和我们使用的附着大小完全一样。

VkClearValue clearColor = {0.0f, 0.0f, 0.0f, 1.0f};
renderPassInfo.clearValueCount = 1;
renderPassInfo.pClearValues = &clearColor;

clearValueCount和pClearValues成员变量用于指定使用VK_ATTACHMENT_LOAD_OP_CLEAR标记后,使用的清除值。在这里,我们使用完全不透明的黑色作为清除值。

vkCmdBeginRenderPass(commandBuffers[i], &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);

所有可以记录指令到指令缓冲的函数的函数名都带有一个vkCmd前缀,并且这些函数的返回值都是void,也就是说在指令记录操作完全结束前,不用进行任何错误处理。

这类函数的第一个参数是用于记录指令的指令缓冲对象。第二个参数是使用的渲染流程的信息。最后一个参数是用来指定渲染流程如何提供绘制指令的标记,它可以是下面这两个值之一:

  • VK_SUBPASS_CONTENTS_INLINE:所有要执行的指令都在主要指令缓冲中,没有辅助指令缓冲需要执行。

  • VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS:有来自辅助指令缓冲的指令需要执行。

由于我们没有使用辅助指令缓冲,所以我们使用VK_SUBPASS_CONTENTS_INLINE。