【Vulkan入门】12-RecordCommands

发布于:2024-12-18 ⋅ 阅读:(58) ⋅ 点赞:(0)

先叨叨

上篇已经创建的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()

  1. vkBeginCommandBuffer的作用是重置CommanderBuffer。也表示开始记录Command。
  2. vkCmdBeginRenderPass的作用开始一个渲染过程
  3. vkCmdBindPipeline将CommandBuffer和Pipeline关联上,表示Commander作用于该Pipeline
  4. vkCmdSetViewport和vkCmdSetScissor用来设置视口和裁剪区域。因为在创建Pipline时,设置了这两个state需要动态设置。
  5. vkCmdDraw为描画操作。这里我们要描画三个点。
  6. vkCmdEndRenderPass 结束渲染过程
  7. 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!");
    }
}

编译并运行代码

能编译成功即可,下一篇将会开始真正的渲染。


网站公告

今日签到

点亮在社区的每一天
去签到