使用shaderc编译Vulkan片段着色器时遇意外令牌错误求助
问题:使用shaderc编译Vulkan片段着色器时出现
error: '' : unexpected token错误 我尝试用shaderc为Vulkan编译着色器,顶点着色器能正常通过,但片段着色器编译时总是报error: '' : unexpected token错误。即使把片段着色器简化成返回静态颜色,错误依然存在。
我的片段着色器代码:
#version 450 core layout(location = 0) out vec4 color; layout(push_constant) uniform Material { vec4 u_Color; } u_MaterialUniforms; void main() { color = u_MaterialUniforms.u_Color; }
编译用的C++代码:
shaderc::Compiler compiler; shaderc::CompileOptions options; options.SetTargetEnvironment(shaderc_target_env_vulkan, shaderc_env_version_vulkan_1_2); const bool optimize = true; if (optimize) { options.SetOptimizationLevel(shaderc_optimization_level_performance); } shaderc::SpvCompilationResult module = compiler.CompileGlslToSpv(source, shaderc_glsl_fragment_shader, FilePath.c_str(), options); if (module.GetCompilationStatus() != shaderc_compilation_status_success) { AE_ASSERT(false, module.GetErrorMessage()); }
排查与解决思路
- 检查
source变量内容:这个错误大概率是传入的着色器源码为空,或者包含不可见非法字符(比如UTF-8 BOM、异常换行符)。可以把source的内容输出到控制台或文件,确认是否正确加载了片段着色器代码,有没有遗漏或乱码。 - 核对
FilePath路径正确性:哪怕顶点着色器路径没问题,也得确认片段着色器的文件路径是否指向正确文件,避免因路径错误加载了空内容或其他无关文件。 - 临时禁用优化编译:先把
optimize设为false,排除优化阶段触发异常的可能性。 - 检查着色器文件编码:确保片段着色器文件是UTF-8无BOM编码,部分编辑器保存的带BOM文件会导致shaderc解析失败。
- 硬编码源码测试:直接把片段着色器代码以字符串形式传入
CompileGlslToSpv,如果能正常编译,说明问题出在文件加载环节;若仍报错,建议更新shaderc到最新版本,排查编译环境兼容性问题。
内容的提问来源于stack exchange,提问作者Adam Gagliardi
相关产品推荐
相关产品推荐

