You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:37:31