狸村 Mystic Web · 狸村
目录

在 Vulkan 的早期版本中,我们需要创建帧缓冲(framebuffer)来将图像视图绑定到渲染通道。然而,随着 Vulkan 1.3 中动态渲染的引入,我们现在可以直接渲染到图像视图,而无需创建帧缓冲或渲染通道。

动态渲染简介

动态渲染通过消除对渲染通道和帧缓冲对象的需求,简化了渲染过程。取而代之的是,我们可以在开始渲染时直接指定颜色、深度和模板附件。

这种方法有几个优点: - 代码更简化,需要管理的对象更少 - 在渲染过程中更改附件具有更大的灵活性 - 与现代渲染技术具有更好的兼容性

让我们看看这在实践中是如何工作的。我们将使用 vk::RenderingAttachmentInfovk::RenderingInfo 结构体来指定我们的附件和渲染参数。

使用动态渲染记录命令缓冲

在下一章中,我们将创建命令缓冲并记录渲染命令。以下是我们如何使用动态渲染的预览:

void recordCommandBuffer(uint32_t imageIndex)
{
    commandBuffer.begin({});

    // 将图像布局转换为渲染状态
    transition_image_layout(
        imageIndex,
        vk::ImageLayout::eUndefined,
        vk::ImageLayout::eColorAttachmentOptimal,
        {},
        vk::AccessFlagBits2::eColorAttachmentWrite,
        vk::PipelineStageFlagBits2::eColorAttachmentOutput,
        vk::PipelineStageFlagBits2::eColorAttachmentOutput
    );

    // 设置颜色附件
    vk::ClearValue clearColor = vk::ClearColorValue(0.0f, 0.0f, 0.0f, 1.0f);
    vk::RenderingAttachmentInfo attachmentInfo = {
		    .imageView   = swapChainImageViews[imageIndex],
		    .imageLayout = vk::ImageLayout::eColorAttachmentOptimal,
		    .loadOp      = vk::AttachmentLoadOp::eClear,
		    .storeOp     = vk::AttachmentStoreOp::eStore,
		    .clearValue  = clearColor};

    // 设置渲染信息
    vk::RenderingInfo renderingInfo = {
		    .renderArea           = {.offset = {0, 0}, .extent = swapChainExtent},
		    .layerCount           = 1,
		    .colorAttachmentCount = 1,
		    .pColorAttachments    = &attachmentInfo};

    // 开始渲染
    commandBuffer.beginRendering(renderingInfo);

    // 渲染命令将放在这里

    // 结束渲染
    commandBuffer.endRendering();

    // 将图像布局转换为呈现状态
    transition_image_layout(
        imageIndex,
        vk::ImageLayout::eColorAttachmentOptimal,
        vk::ImageLayout::ePresentSrcKHR,
        vk::AccessFlagBits2::eColorAttachmentWrite,
        {},
        vk::PipelineStageFlagBits2::eColorAttachmentOutput,
        vk::PipelineStageFlagBits2::eBottomOfPipe
    );

    commandBuffer.end();
}

如你所见,我们在 vk::RenderingAttachmentInfo 结构体中直接指定要渲染的图像视图。我们还指定了加载和存储操作,类似于我们在渲染通道中所做的。然后,vk::RenderingInfo 结构体将其与其他渲染参数组合在一起。

使用这种方法,我们不需要创建帧缓冲或渲染通道,这简化了我们的代码并赋予我们更大的灵活性。

在下一章中,我们将创建命令缓冲并使用动态渲染编写第一个实际的绘制命令。

Vulkan 是 Khronos Group Inc. 的注册商标

教程内容版权归原作者,遵循 CC BY-SA 4.0;本站独立代码及设计除外。