GLSL简单着色器编译出现奇怪错误,该如何修复?
GLSL编译报错:无法识别#version行且出现意外字符
问题重现
编写的顶点着色器代码:
#version 460 layout (location = 0) in vec3 inPos; layout (location = 0) out vec3 outPos; void main() { gl_Position = vec4(inPos.x, inPos.y, inPos.z, 1.0); outPos = inPos; }
使用编译命令:
glslangValidator -V -G -o triangle.vert.spv triangle.vert
得到错误信息:
error : #version: ES shaders for SPIR-V require version 310 or higher error : Source\Shaders\triangle.vert:1: '€' : unexpected token error : Source\Shaders\triangle.vert:1: '' : compilation terminated
修复方案
1. 修复文件编码问题
报错中的€是文件编码带BOM导致的乱码——glslangValidator对带BOM的UTF-8文件解析存在问题,开头的BOM字节被识别成了无效字符。
- 用文本编辑器(如VS Code、Notepad++)打开着色器文件,将编码切换为无BOM的UTF-8:
- VS Code:点击右下角编码标识,选择"通过编码重新打开"->"UTF-8"后保存;
- Notepad++:选择菜单栏"编码"->"转为UTF-8无BOM格式"后保存文件。
2. 匹配编译参数与着色器版本
命令中的-G参数指定生成OpenGL ES兼容的SPIR-V,但你的着色器使用了桌面OpenGL的#version 460版本,两者不兼容导致版本错误。
- 若编译桌面OpenGL的SPIR-V:移除
-G参数,命令改为:glslangValidator -V -o triangle.vert.spv triangle.vert - 若需要OpenGL ES的SPIR-V:修改着色器版本为ES兼容版本(如
#version 310 es或更高),保留-G参数。
内容的提问来源于stack exchange,提问作者Liyuu_
相关产品推荐
相关产品推荐

