跳到主要内容

:material-chevron-right-circle: vkCmdBeginRenderPass

函数原型

void vkCmdBeginRenderPass(
VkCommandBuffer commandBuffer,
const VkRenderPassBeginInfo* pRenderPassBegin,
VkSubpassContents contents);

描述

开启一个渲染通道。

参数

  • commandBuffer : 录制指令的命令缓冲区。
  • pRenderPassBegin : VkRenderPassBeginInfo结构体指针,指定要开始的渲染通道以及使用的帧缓冲区。
  • contents : VkSubpassContents值,用于指定第一个子通道中的命令提供的方式。

补充

VkRenderPassBeginInfo 结构体定义:

typedef struct VkRenderPassBeginInfo {
VkStructureType sType;
const void* pNext;
VkRenderPass renderPass;
VkFramebuffer framebuffer;
VkRect2D renderArea;
uint32_t clearValueCount;
const VkClearValue* pClearValues;
} VkRenderPassBeginInfo;
  • sType : VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO
  • renderPass : 开始的渲染通道。
  • framebuffer : 帧缓冲区,帧缓冲区包含渲染通道使用的附件。
  • renderArea : 渲染区域。
  • clearValueCount : pClearValues数组中的元素个数。
  • pClearValues : 如果附件的loadOp/stencilLoadOp的值是VK_ATTACHMENT_LOAD_OP_CLEAR, 则按照顺序使用pClearValues数组里的值进行清除。

VkSubpassContents 枚举定义:

typedef enum VkSubpassContents {
VK_SUBPASS_CONTENTS_INLINE = 0,
VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS = 1,
} VkSubpassContents;
  • VK_SUBPASS_CONTENTS_INLINE : 表示渲染命令直接写在当前 commandbuffer 中。
  • VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS : 用于vkCmdExecuteCommands执行预先录制的二级 commandbuffer。

返回值

代码示例

VkClearValue clearValues[2] = {};
clearValues[0].color = { {0.1f, 0.1f, 0.1f, 1.0f} };
clearValues[1].depthStencil = {1.0f, 0};

VkRenderPassBeginInfo renderPassInfo{};
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
renderPassInfo.renderPass = myRenderPass;
renderPassInfo.framebuffer = myFramebuffer;
renderPassInfo.renderArea.offset = {0, 0};
renderPassInfo.renderArea.extent = swapchainExtent;
renderPassInfo.clearValueCount = 2;
renderPassInfo.pClearValues = clearValues;

vkCmdBeginRenderPass(cmdBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);

// 绑定管线并绘制
vkCmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, myPipeline);
vkCmdDraw(cmdBuffer, 3, 1, 0, 0);

vkCmdEndRenderPass(cmdBuffer);