动态渲染
介绍
在 Vulkan 的早期版本中,在完成管线创建之前,我们需要通过渲染通道对象告诉 Vulkan 在渲染过程中将使用的帧缓冲区附件。然而,随着 Vulkan 1.3 中动态渲染的引入,我们现在可以在创建图形管线和记录命令缓冲区时直接指定这些信息。
动态渲染通过消除对渲染通道和帧缓冲区对象的需求,简化了渲染过程。相反,我们可以在开始渲染时直接指定颜色、深度和模板附件。
管线渲染创建信息
要使用动态渲染,我们需要指定渲染过程中将使用的附件格式。这是在创建图形管线时通过 vk::PipelineRenderingCreateInfo 结构完成的:
vk::PipelineRenderingCreateInfo pipelineRenderingCreateInfo{ .colorAttachmentCount = 1, .pColorAttachmentFormats = &swapChainImageFormat };
此结构指定我们将使用一个颜色附件,其格式为交换链图像的格式。然后,我们将此结构包含在 vk::GraphicsPipelineCreateInfo 结构的 pNext 链中:
vk::GraphicsPipelineCreateInfo pipelineInfo{ .pNext = &pipelineRenderingCreateInfo,
.stageCount = 2, .pStages = shaderStages,
.pVertexInputState = &vertexInputInfo, .pInputAssemblyState = &inputAssembly,
.pViewportState = &viewportState, .pRasterizationState = &rasterizer,
.pMultisampleState = &multisampling, .pColorBlendState = &colorBlending,
.pDynamicState = &dynamicState, .layout = pipelineLayout, .renderPass = nullptr };
请注意,renderPass 参数设置为 nullptr,因为我们使用的是动态渲染而不是传统的渲染通道。
命令缓冲区记录
在记录命令缓冲区时,我们将使用 vk::CommandBuffer::beginRendering 函数开始渲染到指定的附件。我们将在绘制章节中更详细地介绍这一点。
动态渲染的优点是它通过消除对渲染通道和帧缓冲区对象的需求,简化了渲染过程。它还提供了更大的灵活性,允许我们更改正在渲染到的附件,而无需创建新的渲染通道对象。
在 下一章,我们将把所有内容放在一起,最终创建图形管线对象!
C++ 代码 / Slang 着色器 / GLSL 顶点着色器 / GLSL 片段着色器