为何使用shaderc_glsl_infer_from_source推断着色器类型会报错?
问题
使用shaderc编译着色器时,希望通过shaderc_glsl_infer_from_source类型,借助源码中的#pragma注解自动推断着色器类型,避免手动指定shaderc_vertex_shader或shaderc_fragment_shader。尝试添加如下注解:
#version 450 #extension GL_ARB_separate_shader_objects : enable #pragma shaderc_fragment_shader // The rest of the shader goes here
但编译后程序报错,错误信息如下:
Shader module compilation failed - Validation layer: Validation Error: [ VUID_Undefined ] Object 0: handle = 0x1fa16e5fd90, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x79de34d4 | vkCreateShaderModule: parameter pCreateInfo->codeSize / 4 must be greater than 0. Validation layer: Validation Error: [ UNASSIGNED-CoreValidation-Shader-InconsistentSpirv ] Object 0: handle = 0x1fa16e5fd90, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x6bbb14 | SPIR-V module not valid: Invalid SPIR-V magic number. Failed to create shader module!
手动指定着色器类型时一切正常,请问哪里操作有误?所用#pragma指令是否正确?
问题分析与解决
- 错误原因:你用的
#pragma shaderc_fragment_shader指令格式不符合shaderc的识别规则,无法被当作着色器类型推断的依据,导致编译没有生成有效的SPIR-V代码,进而触发后续的codeSize为0和无效魔数错误。 - 正确的
#pragma指令格式:shaderc识别的用于推断着色器类型的注解是#pragma shader_stage(stage),其中stage对应vertex、fragment等着色器阶段。修正后的示例代码:
#version 450 #extension GL_ARB_separate_shader_objects : enable #pragma shader_stage(fragment) // The rest of the shader goes here
- 验证逻辑:当指定
shaderc_glsl_infer_from_source时,shaderc会扫描源码中的#pragma shader_stage(...)注解来确定着色器类型,没有该注解或注解格式错误时,编译会失败并无法生成有效SPIR-V,这就是你遇到问题的核心原因。
内容的提问来源于stack exchange,提问作者Anselmo GPP
相关产品推荐
相关产品推荐

