编译着色器

现在,让我们在项目目录下创建一个叫做shaders的文件夹,然后在其中添加一个叫做shader.vert的保存有顶点着色器代码的文件,以及一个叫做shader.frag的保存有片段着色器代码的文件。GLSL并没有规定着色器文件应该使用的扩展名称,上面使用的扩展名名称来源于习惯。

shader.vert文件的内容如下:

#version 450
#extension GL_ARB_separate_shader_objects : enable

out gl_PerVertex {
    vec4 gl_Position;
};

layout(location = 0) out vec3 fragColor;

vec2 positions[3] = vec2[](
                vec2(0.0, -0.5),
                vec2(0.5, 0.5),
                vec2(-0.5, 0.5)
);

vec3 colors[3] = vec3[](
                vec3(1.0, 0.0, 0.0),
                vec3(0.0, 1.0, 0.0),
                vec3(0.0, 0.0, 1.0)
);

void main() {
    gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0);
    fragColor = colors[gl_VertexIndex];
}

shader.frag文件的内容如下:

#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(location = 0) in vec3 fragColor;

layout(location = 0) out vec4 outColor;

void main() {
    outColor = vec4(fragColor, 1.0);
}

接下来,我们使用glslangValidator来将着色器代码编译为SPIR-V字节码格式。

Windows

创建一个compile.bat文件,它的内容如下:

C:/VulkanSDK/1.0.17.0/Bin32/glslangValidator.exe -V shader.vert
C:/VulkanSDK/1.0.17.0/Bin32/glslangValidator.exe -V shader.frag
pause

读者需要将上面代码中glslangValidator.exe的文件路径替换为自己的glslangValidator.exe所在的文件路径。双击运行这个文件,就可以完成着色器代码的编译。

Linux

创建一个compile.sh文件,它的内容如下:

/home/user/VulkanSDK/x.x.x.x/x86_64/bin/glslangValidator -V shader.vert
/home/user/VulkanSDK/x.x.x.x/x86_64/bin/glslangValidator -V shader.frag

读者需要将上面代码中glslangValidator的文件路径替换为自己的glslangValidator所在的文件路径。然后在终端中使用chmod +x compile.sh给予它可执行的权限,最后运行它。

以下部分与平台无关

上面我们使用两行代码使用-V选项调用编译器,将GLSL着色器代码文件转换为SPIR-V字节码格式。运行脚本后,读者可以在当前文件夹下看到两个新的文件vert.spv和frag.spv。这两个文件的文件名由编译器自动推导出来,读者可以使用自己喜欢的名称重命名这两个文件。编译脚本的执行过程中可能出现一些缺少特性的警告,读者可以放心地忽略掉这些警告。

如果着色器代码存在语法错误,编译器会报告语法错误所在的行,以及错误出现的原因。读者可以尝试去掉某行着色器代码的分号,让编译器检查这一语法错误,熟悉编译器的报错信息的。也可以尝试不使用任何选项调用编译器来查看编译器支持的选项种类。此外,编译器还支持将SPIR-V格式的字节码反向编译为便于人类阅读的代码格式。