跳到主要内容

什么是 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 着色器编译工具、库和测试的集合,它包含了glslcspvcglslc具备glslangSPIRV-Tools中的核心功能的内容。spvc具备SPIRV-CrossSPIRV-Tools的核心功能。

Shaderc 将这两个工具构建为独立的命令行工具 ( glslc ) 以及链接库 ( libshaderc )。

DXC

DirectXShaderCompiler还支持将 HLSL 转换为 SPIR-V

什么是spirv_dxc.png

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 等工具进行了两次精彩演讲

什么_is_spirv_spriv_cross.png

SPIRV-LLVM

Khronos的SPIRV-LLVM项目是一个支持 SPIR-V 的 LLVM 框架。它旨在包含 LLVM 和 SPIR-V 之间的双向转换器。它还作为基于LLVM 前端的 SPIR-V 编译器。