什么是 SPIR-V
想了解关于 SPIR-V 更详细的息,请阅读SPIRV指南
SPIR-V最初发布于 2015 年。 它是多个 Khronos API 共用的中间语言,包括 Vulkan, OpenGL, 以及 OpenCL。使用Vulkan时,应用程序仍然可以使用高级着色语言(例如 GLSL 或HLSL)编写着色器,但使用vkCreateShaderModule时需要 SPIR-V 二进制文件。 Khronos 有一份关于 SPIR-V 及其优点的白皮书。这里和这里还有 2016 年 Vulkan DevDay 的两场精彩的 Khronos 演讲 (演讲视频)。
SPIR-V 接口和功能
Vulkan 有一个完整的章节说明了Vulkan 如何与 SPIR-V 着色器交互。 大多数SPIR-V 接口的使用发生在pipeline创建过程中的着色器编译阶段。
SPIR-V 具有许多功能,因为除了 Vulkan 之外还有其他语言使用它。要查看 Vulkan 所需的支持功能,可以参考附录。 Vulkan 中的一些扩展和功能只是为了检查某些 SPIR-V 功能是否支持。
编译器
glslang
glslang是Khronos开发的 GLSL、HLSL 和 ESSL 前端,以及示例 SPIR-V 生成器。其中包含一个独立glslangValidator
工具,可用于从 GLSL、HLSL 和 ESSL 创建 SPIR-V。
Shaderc
由 Google 托管的 Vulkan 着色器编译工具、库和测试的集合,它包含了glslc
和spvc
,glslc
具备glslang和SPIRV-Tools中的核心功能的内容。spvc
具备SPIRV-Cross和SPIRV-Tools的核心功能。
Shaderc 将这两个工具构建为独立的命令行工具 ( glslc ) 以及链接库 ( libshaderc )。
DXC
DirectXShaderCompiler还支持将 HLSL 转换为 SPIR-V。
Clspv
Clspv是 OpenCL C 子集到 SPIR-V 的原型编译器,用作 Vulkan 计算着色器。
工具和生态系统
有一个丰富的工具生态系统可以利用 SPIR-V。 Vulkan SDK spirv工具链为开发人员构建和打包了所有 SPIR-V 工具。
SPIRV-Tools
Khronos的 SPIRV-Tools项目提供 C 和 C++ API 以及命令行界面来与 SPIR-V 模块配合使用。更多信息请参见SPIRV 指南。
SPIRV-Cross
Khronos的 SPIRV-Cross项目是一个实用的工具和库,用于在 SPIR-V 上执行反射并将 SPIR-V 反汇编回所需的高级着色语言。SPIR-V Cross 的主要开发人员Hans Kristian在2018 Vulkanized视频)和2019 Vulkanized视频)中就如何创建 SPIR-V Cross 等工具进行了两次精彩演讲
SPIRV-LLVM
Khronos的SPIRV-LLVM项目是一个支持 SPIR-V 的 LLVM 框架。它旨在包含 LLVM 和 SPIR-V 之间的双向转换器。它还作为基于LLVM 前端的 SPIR-V 编译器。