记录指令到指令缓冲

我们通过调用vkBeginCommandBuffer函数开始指令缓冲的记录操作,这一函数以VkCommandBufferBeginInfo结构体作为参数来指定一些有关指令缓冲的使用细节。

for (size_t i = 0; i < commandBuffers.size(); i++) {
    VkCommandBufferBeginInfo beginInfo = {};
    beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
    beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
    beginInfo.pInheritanceInfo = nullptr; // Optional

    if (vkBeginCommandBuffer(commandBuffers[i], &beginInfo) != VK_SUCCESS) {
        throw std::runtime_error("failed to begin recording command buffer!");
    }
}

flags成员变量用于指定我们将要怎样使用指令缓冲。它的值可以是下面这些:

  • VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT:指令缓冲在执行一次后,就被用来记录新的指令。

  • VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT:这是一个只在一个渲染流程内使用的辅助指令缓冲。

  • VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT:在指令缓冲等待执行时,仍然可以提交这一指令缓冲。

在这里,我们使用了VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT标记,这使得我们可以在上一帧还未结束渲染时,提交下一帧的渲染指令。pInheritanceInfo成员变量只用于辅助指令缓冲,可以用它来指定从调用它的主要指令缓冲继承的状态。

指令缓冲对象记录指令后,调用vkBeginCommandBuffer函数会重置指令缓冲对象。