先叨叨
上篇已经创建的CommandPool和CommandBuffer。接下来就可以向CommandBuffer中记录命令了。
Git信息
- repository: https://gitee.com/J8_series/easy-car-ui
- tag: 12-RecordCommands
- url: https://gitee.com/J8_series/easy-car-ui/tree/12-RecordCommands
关键代码
VulkanEnv::RecordCommandBuffer()
- vkBeginCommandBuffer的作用是重置CommanderBuffer。也表示开始记录Command。
- vkCmdBeginRenderPass的作用开始一个渲染过程
- vkCmdBindPipeline将CommandBuffer和Pipeline关联上,表示Commander作用于该Pipeline
- vkCmdSetViewport和vkCmdSetScissor用来设置视口和裁剪区域。因为在创建Pipline时,设置了这两个state需要动态设置。
- vkCmdDraw为描画操作。这里我们要描画三个点。
- vkCmdEndRenderPass 结束渲染过程
- vkEndCommandBuffer 结束记录CommandBuffer。
以上以kCmd开始的API就是记录到CommanderBuffer中的Command
void VulkanEnv::RecordCommandBuffer()
{
VkCommandBufferBeginInfo beginInfo{};
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
if (vkBeginCommandBuffer(m_commandBuffer, &beginInfo) != VK_SUCCESS) {
throw std::runtime_error("failed to begin recording command buffer!");
}
VkRenderPassBeginInfo renderPassInfo{};
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
renderPassInfo.renderPass = m_testPipeline.GetRenderPass();
renderPassInfo.framebuffer = m_testPipeline.GetFramebuffer();
renderPassInfo.renderArea.offset = {0, 0};
renderPassInfo.renderArea.extent = {m_width, m_height};
VkClearValue clearColor = {{{0.0f, 0.0f, 0.0f, 1.0f}}};
renderPassInfo.clearValueCount = 1;
renderPassInfo.pClearValues = &clearColor;
vkCmdBeginRenderPass(m_commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
vkCmdBindPipeline(m_commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_testPipeline.GetPipeline());
VkViewport viewport{};
viewport.x = 0.0f;
viewport.y = 0.0f;
viewport.width = (float) m_width;
viewport.height = (float) m_height;
viewport.minDepth = 0.0f;
viewport.maxDepth = 1.0f;
vkCmdSetViewport(m_commandBuffer, 0, 1, &viewport);
VkRect2D scissor{};
scissor.offset = {0, 0};
scissor.extent = {m_width, m_height};
vkCmdSetScissor(m_commandBuffer, 0, 1, &scissor);
vkCmdDraw(m_commandBuffer, 3, 1, 0, 0);
vkCmdEndRenderPass(m_commandBuffer);
if (vkEndCommandBuffer(m_commandBuffer) != VK_SUCCESS) {
throw std::runtime_error("failed to record command buffer!");
}
}
编译并运行代码
能编译成功即可,下一篇将会开始真正的渲染。