管线布局
我们可以在着色器中使用uniform变量,它可以在管线建立后动态地被应用程序修改,实现对着色器进行一定程度的动态配置。uniform变量经常被用来传递变换矩阵给顶点着色器,以及传递纹理采样器句柄给片段着色器。
我们在着色器中使用的uniform变量需要在管线创建时使用VkPipelineLayout对象定义。暂时,我们不使用uniform变量,但我们仍需要创建一个VkPipelineLayout对象,指定空的管线布局。
添加一个成员变量存储VkPipelineLayout对象,在后面我们会用到它。
VkPipelineLayout pipelineLayout;
createGraphicsPipeline函数中创建VkPipelineLayout对象:
VkPipelineLayoutCreateInfo pipelineLayoutInfo = {};
pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
pipelineLayoutInfo.setLayoutCount = 0; // Optional
pipelineLayoutInfo.pSetLayouts = nullptr; // Optional
pipelineLayoutInfo.pushConstantRangeCount = 0; // Optional
pipelineLayoutInfo.pPushConstantRanges = nullptr; // Optional
if (vkCreatePipelineLayout(device, &pipelineLayoutInfo, nullptr, &pipelineLayout) != VK_SUCCESS) {
throw std::runtime_error("failed to create pipeline layout!");
}
可以通过VkPipelineLayout结构体指定可以在着色器中使用的常量值。最后,VkPipelineLayout对象需要我们在应用程序结束前自己清除它:
void cleanup() {
vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
...
}