vk::StructureChain<vk::GraphicsPipelineCreateInfo, vk::PipelineRenderingCreateInfo> pipelineCreateInfoChain = {
{.stageCount = 2,
.pStages = shaderStages,
现在我们可以将前几章中的所有结构体和对象组合起来,创建图形管线了! 作为快速回顾,以下是我们现在拥有的对象类型:
着色器阶段:定义图形管线可编程阶段功能的着色器模块
固定功能状态:定义管线固定功能阶段的所有结构体,如输入汇编、光栅化器、视口和颜色混合
管线布局:着色器引用的 uniform 和 push 值,可在绘制时更新
动态渲染:渲染期间将使用的附件的格式
所有这些组合起来完整地定义了图形管线的功能,因此我们现在可以在 createGraphicsPipeline 函数的末尾开始填充 vk::GraphicsPipelineCreateInfo 结构体。
vk::StructureChain<vk::GraphicsPipelineCreateInfo, vk::PipelineRenderingCreateInfo> pipelineCreateInfoChain = {
{.stageCount = 2,
.pStages = shaderStages,
我们从引用 vk::PipelineShaderStageCreateInfo 结构体数组开始。
.pVertexInputState = &vertexInputInfo,
.pInputAssemblyState = &inputAssembly,
.pViewportState = &viewportState,
.pRasterizationState = &rasterizer,
.pMultisampleState = &multisampling,
.pColorBlendState = &colorBlending,
.pDynamicState = &dynamicState,
然后引用所有描述固定功能阶段的结构体。
.layout = pipelineLayout,
接下来是管线布局,它是一个 Vulkan 句柄,而不是结构体指针。
.renderPass = nullptr},
{.colorAttachmentCount = 1, .pColorAttachmentFormats = &swapChainSurfaceFormat.format}};
请注意,我们使用的是动态渲染而不是传统的渲染通道,因此我们将 renderPass 参数设置为 nullptr,并在 vk::StructureChain 中包含一个 vk::PipelineRenderingCreateInfo 结构体。该结构体指定了渲染期间将使用的附件的格式。
vk::GraphicsPipelineCreateInfo 实际上还有两个成员:basePipelineHandle 和 basePipelineIndex。
Vulkan 允许你通过从现有管线派生来创建新的图形管线。
管线派生的思想是,当管线与现有管线有很多共同功能时,设置管线的成本较低,并且从同一父管线切换管线也可以更快。
你可以使用 basePipelineHandle 指定现有管线的句柄,或使用 basePipelineIndex 通过索引引用另一个即将创建的管线。
这些值仅在 vk::GraphicsPipelineCreateInfo 的 flags 字段中也指定了 vk::PipelineCreateFlagBits::eDerivative 标志时才使用。
目前只有一个管线,因此我们将忽略这些成员。
现在为最后一步做准备,创建一个类成员来保存 vk::raii::Pipeline 对象:
vk::raii::Pipeline graphicsPipeline = nullptr;
最后,创建图形管线:
graphicsPipeline = vk::raii::Pipeline(device, nullptr, pipelineCreateInfoChain.get<vk::GraphicsPipelineCreateInfo>());
第二个参数我们传递了 nullptr 参数,它引用了一个可选的 vk::raii::PipelineCache 对象。
管线缓存可用于在多次调用 vk::raii::Pipeline 构造函数之间存储和重用与管线创建相关的数据,如果缓存存储到文件中,甚至可以在程序执行之间重用。
这使得以后可以显著加快管线创建速度。我们将在管线缓存章节中介绍这一点。
图形管线是所有常见绘制操作所必需的。
现在运行你的程序,确认所有这些努力都成功地创建了管线! 我们已经非常接近看到屏幕上出现一些东西了。 在接下来的几章中,我们将从交换链图像设置实际的帧缓冲,并准备绘制命令。
C++ 代码 / Slang 着色器 / GLSL 顶点着色器 / GLSL 片段着色器
Vulkan 是 Khronos Group Inc. 的注册商标
教程内容版权归原作者,遵循 CC BY-SA 4.0;本站独立代码及设计除外。