仅使用Set 2的Descriptor Set Layout导致图形Pipeline创建失败
Vulkan Pipeline创建失败问题
背景
- 具备2年OpenGL业余项目开发经验,完成Vulkan教程后正在对模块进行抽象,当前深入学习Descriptor Set相关概念
- 原本Descriptor功能正常,可实现图像渲染,原片段着色器代码:
#version 450 layout(location = 0) in vec4 fColor; layout(location = 1) in vec2 fTexCoord; layout(location = 2) in float fTexIndex; layout(location = 0) out vec4 outColor; layout(binding = 1) uniform sampler2D texSampler[32]; void main() { outColor = fColor; outColor *= texture(texSampler[int(fTexIndex)], fTexCoord); if (outColor.a == 0) discard; }
操作与问题场景
为优化Descriptor Set的使用效率,参考游戏引擎开发指南拆分Set:
- Set 0:每帧全局数据,每帧绑定一次
- Set 1:每帧RenderPass数据,每次RenderPass绑定一次
- Set 2:每帧材质数据,每个材质绑定一次
- Set 3:每帧对象数据,每个对象绑定一次
对片段着色器进行修改,将纹理采样器的绑定指定到Set 2:
layout(set = 2, binding = 1) uniform sampler2D texSampler[32];
确认所有相关代码已正确引用Set 2,且当前着色器仅使用Set 2的该绑定,Set 0、1、3无任何绑定。
错误现象
重新编译着色器并运行程序后,图形Pipeline创建失败,报错信息如下:
Validation Error: [ VUID-VkGraphicsPipelineCreateInfo-layout-00756 ] Object 0: handle = 0x1c580c12c70, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x45717876 | Shader uses descriptor slot 2.1 (expected `VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER`) but not declared in pipeline layout
- 通过着色器编译器的反射数据创建Descriptor Set Layout,将其传入Pipeline Layout创建流程,Pipeline Layout创建成功,但Pipeline创建失败
- 无法理解修改Set布局后为何出现该错误,此前预期遗漏Set修改环节才会报错
内容的提问来源于stack exchange,提问作者nepp95
相关产品推荐
相关产品推荐

