俚语
Slang 是一种着色语言,它使得以模块化和可扩展的方式构建和维护大型着色器代码库变得更加容易,同时在现代 GPU 和图形 API 上保持最高性能。Slang 是基于 NVIDIA、卡内基梅隆大学、斯坦福大学、麻省理工学院、加州大学圣地亚哥分校和华盛顿大学的研究人员多年合作的成果。
主要特性
Slang 系统旨在为实时图形应用程序的开发人员提供处理着色器代码时所需的服务。
-
Slang 与大多数现有的 HLSL 代码向后兼容。无需重写或移植着色器代码库就可以开始利用 Slang 的优势。
-
Slang 编译器可以为各种目标和 API 生成代码:D3D12、Vulkan、Metal、D3D11、OpenGL、CUDA 和 CPU。Slang 代码可以广泛兼容,同时还能利用每个平台的独特功能。对于文本目标(如 Metal Shading Language(MSL) 和 CUDA),Slang 生成可读的代码,保留原始标识符名称以及类型和调用结构,便于调试。
-
自动微分作为一级语言特性。Slang 可以自动生成涉及任意控制流和动态调度的复杂函数的正向和反向导数传播代码。这使用户可以轻松地使现有渲染代码库可微分,或通过
slangtorch
在 PyTorch 驱动的机器学习框架中使用 Slang 作为核心语言。 -
泛型和接口允许以清晰的方式表达着色器专用化,而无需使用预处理器技术或字符串粘贴。与 C++ 模板不同,Slang 的泛型会提前检查,不会产生难以诊断的级联错误消息。同一个泛型着色器可以针对各种不同类型进行专用化,以提前或动态生成专用代码,完全由应用程序控制。
-
Slang 提供了一个模块系统,可用于逻辑组织代码并受益于分离编译。Slang 模块可以离线编译为自定义 IR(可选混淆),然后在运行时链接以生成 DXIL、SPIR-V 等。
-
参数块(以
ParameterBlock<T>
形式公开)提供了一个一级语言特性,用于对相关的着色器参数进行分组,并指定应将它们作为一个连贯的块传递给 GPU。参数块使应用程序可以轻松使用每个 API 最高效的参数绑定模型,如 D3D12/Vulkan 中的描述符表/集。 -
Slang 支持完全自动化和确定性地为参数分配绑定位置,而不是要求每个着色器参数都进行繁琐的显式
register
和layout
规范。您可以编写简单清晰的代码,同时获得应用程序所需的确定性布局。 -
对于需要的应用程序,Slang 提供了有关着色器代码参数的完整反射信息,并在所有目标平台和图形 API 上提供一致的 API。与一些其他编译器不同,Slang 不会根据参数的使用情况重新排序或删除着色器参数,因此您始终可以看到完整的情况。
-
通过语言服务器协议在 Visual Studio Code 和 Visual Studio 中提供完整的智能感知功能。
-
通过 SPIRV 和 RenderDoc 提供完整的调试体验。
入门
如果您想在不安装任何东西的情况下尝试 Slang 语言,一个快速简单的方法是使用着色器游乐场。
在您自己的开发中开始使用 Slang 的最快方法是使用预构建的二进制包,可通过 GitHub 发布获得。有针对 32 位和 64 位 Windows 以及 64 位 Ubuntu 构建的软件包。每个二进制发布版本都包括命令行 slangc
编译器、编译器的共享库和 slang.h
头文件。
如果您想从源代码构建 Slang,请参阅构建说明。
文档
Slang 项目提供了各种不同的文档,但大多数用户最好从用户指南开始。
我们还提供了一些如何将 Slang 集成到渲染应用程序中的示例。
这些示例使用了我们随 Slang 一起提供的名为 "GFX" 的图形层,它是各种图形 API(D3D11、D2D12、OpenGL、Vulkan、CUDA 和 CPU)的抽象库,用于支持使用 GPU 图形和计算功能的跨平台应用程序。如果您想了解更多关于 GFX 的信息,请参阅 GFX 用户指南。
此外,我们建议查看 Vulkan Mini Examples,了解更多使用 Slang 语言特性(如指针和光线追踪内部函数)在 Vulkan 上可用的示例。
贡献
如果您想为项目做出贡献,我们很高兴能得到您的意见。贡献者应遵守以下准则:
- 请遵守贡献者行为准则。
- 错误报告和功能请求应通过 GitHub 问题跟踪器提交。
- 更改最好以小型拉取请求的形式提交到
master
分支上,来自您自己的项目分支。 - 涉及多个贡献者或需要长时间开发的大型功能应在问题中讨论,并拆分成可以分阶段实施和检查的较小部分。
贡献指南更详细地描述了贡献者的工作流程。
限制和支持
平台支持
Windows | Linux | MacOS |
---|---|---|
支持 | 支持 | 支持 |
目标支持
Direct3D 11 | Direct3D 12 | Vulkan | Metal | CUDA | OptiX | CPU Compute |
---|---|---|---|---|---|---|
HLSL | HLSL | GLSL & SPIR-V | Metal Shading Language (顶点/片段/计算着色器阶段) | C++ (仅计算) | C++ (进行中) | C++ (仅计算) |
*有关更多详细信息,请参阅用户指南中的支持的编译目标部分
Slang 项目已用于生产应用程序和大型着色器代码库,但仍在积极开发中。目前的支持主要集中在 Slang 使用最广泛的平台(Windows、Linux)和目标 API(Direct3D 12、Vulkan)上。寻求其他平台或 API 支持的用户应通过问题跟踪器与开发团队协调,以确保可以支持他们的用例。
许可证
Slang 代码本身采用 MIT 许可证(参见 LICENSE)。
核心 Slang 工具的构建自动或可选地依赖于以下项目,这些项目可能有自己的许可证:
glslang
(BSD)lz4
(BSD)miniz
(MIT)spirv-headers
(修改后的 MIT)spirv-tools
(Apache 2.0)ankerl::unordered_dense::{map, set}
(MIT)
Slang 发布版可能包括 slang-llvm,其中包含根据以下许可证的 LLVM:
llvm
(带 LLVM 例外的 Apache 2.0 许可证)
一些使用 Slang 构建的测试和示例程序使用以下项目,这些项目可能有自己的许可证:
glm
(MIT)- 来自
stb
单文件库集合的stb_image
和stb_image_write
(公共领域) tinyobjloader
(MIT)