shader-slang/slang
GitHub: shader-slang/slang
一种现代化的着色语言和编译器,通过模块化设计、泛型系统和自动微分等特性,简化大型着色器代码库的开发与维护,并支持跨平台编译到多种图形API和计算后端。
Stars: 5126 | Forks: 431
# 俚语


Slang 是一种着色语言,旨在让开发者能够以模块化和可扩展的方式更轻松地构建和维护大型着色器代码库,同时在现代 GPU 和图形 API 上保持尽可能高的性能。
Slang 基于 NVIDIA、卡内基梅隆大学、斯坦福大学、麻省理工学院、加州大学圣地亚哥分校和华盛顿大学的研究人员多年的合作成果。
## 为什么选择 Slang?
Slang 着色语言旨在帮助实时图形开发者处理大规模、高性能的着色器代码。
### 一次编写,到处运行
Slang 编译器可以为多种目标生成代码:D3D12、Vulkan、Metal、D3D11、CUDA,甚至可以生成在 CPU 上运行的代码。对于文本目标(如 Metal Shading Language (MSL) 和 CUDA),Slang 会生成可读的代码,保留原始标识符名称以及类型和调用结构,从而更容易进行调试。
### 访问最新的 GPU 特性
Slang 代码具有高度可移植性,但仍可利用独特的平台功能,包括 Direct3D 和 Vulkan 的最新特性。例如,开发者在生成 SPIR-V 时可以充分利用[指针](https://shader-slang.com/slang/user-guide/convenience-features.html#pointers-limited)。
Slang 的[能力系统 (capability system)](https://shader-slang.com/slang/user-guide/capabilities.html) 通过确保代码在生成最终代码之前的类型检查步骤中仅使用可用功能,帮助应用程序管理不同目标平台之间的功能集差异。此外,Slang 提供了[灵活的互操作](https://shader-slang.com/slang/user-guide/a1-04-interop.html) 特性,支持将目标代码或 SPIR-V 直接嵌入到生成的着色器中。
### 利用自动微分赋能神经图形学
Slang 可以[自动生成包含任意控制流和动态调度的复杂函数的前向和反向导数传播代码](https://shader-slang.com/slang/user-guide/autodiff.html)。这使得现有的渲染代码库能够轻松实现可微分,或者通过 [`slangtorch`](https://shader-slang.com/slang/user-guide/a1-02-slangpy.html) 让 Slang 作为 PyTorch 驱动的机器学习框架中的内核语言。
### 通过模块实现可扩展的软件开发
Slang 提供了一个[模块系统](https://shader-slang.com/slang/user-guide/modules.html),支持将代码进行逻辑组织以进行单独编译。Slang 模块可以离线独立编译为自定义 IR(带有可选的混淆),然后在运行时链接以生成 DXIL 或 SPIR-V 等格式的代码。
### 与模块协同工作的代码特化
Slang 支持[泛型和接口](https://shader-slang.com/slang/user-guide/interfaces-generics.html)(也称为类型特征/协议),允许清晰地表达着色器特化,而无需使用预处理器技术或字符串拼接。与 C++ 模板不同,Slang 的泛型是预先检查的,不会产生难以诊断的级联错误消息。同一个泛型着色器可以针对多种不同的类型进行特化,从而在应用程序的完全控制下提前或即时生成特化代码。
### HLSL 和 GLSL 代码库的轻松入门
Slang 的语法类似于 HLSL,大多数现有的 HLSL 代码可以开箱即用地使用 Slang 编译器进行编译,或者只需进行微小的修改。这使得现有的着色器代码库能够立即从 Slang 中受益,而无需完全重写或移植。
Slang 提供了一个兼容性模块,支持使用大多数 GLSL 内部函数和 GLSL 的参数绑定语法。
### 全面的工具支持
Slang 通过语言服务器协议 (Language Server Protocol) 在 Visual Studio Code 和 Visual Studio 中提供完整的 IntelliSense 编辑功能支持。
通过 RenderDoc 和基于 SPIR-V 的工具也可以实现完整的调试功能。
## 快速开始
在您自己的开发中使用 Slang 的最快方法是使用 GitHub [releases](https://github.com/shader-slang/slang/releases) 中提供的预构建二进制包。
自 1.3.296.0 版本起,Slang 二进制文件也包含在 [Vulkan SDK](https://vulkan.lunarg.com/sdk/home) 中。
我们为 x86_64 和 aarch64 架构的 Windows、Linux 和 macOS 构建了相应的包。
每个二进制版本都包含命令行 `slangc` 编译器、编译器的共享库以及 `slang.h` 头文件。
有关使用 `slangc` 命令行工具的信息,请参阅用户指南:[Slang Command Line Usage](
https://shader-slang.com/slang/user-guide/compiling.html#command-line-compilation-with-slangc)。
如果您想在不安装任何东西的情况下试用 Slang 语言,一种快速简便的方法是使用 [Slang Playground](https://shader-slang.com/slang-playground)。Playground 允许您将 Slang 代码编译为多种目标,甚至可以直接在浏览器中运行一些简单的着色器。Playground 会将 Slang 编译器加载到您的浏览器中,并在本地运行所有编译。数据不会被发送到任何服务器。
如果您想从源代码构建 Slang,请查阅[构建说明](docs/building.md)。
## 文档
Slang 项目提供了各种不同的[文档](docs/),但大多数用户最好从[用户指南](https://shader-slang.github.io/slang/user-guide/)开始。
对于编写 Slang 代码的开发者,[Slang Core Module Reference](https://shader-slang.com/stdlib-reference/) 提供了关于 Slang 内置类型和函数的详细文档。
我们还提供了一些关于如何将 Slang 集成到渲染应用程序中的[示例](examples/)。
这些示例使用了一个随 Slang 提供的名为“GFX”的图形层,这是一个对各种图形 API(D3D11、D2D12、OpenGL、Vulkan、CUDA 和 CPU)的抽象库,用于支持使用 GPU 图形和计算功能的跨平台应用程序。
GFX 正在被逐步弃用,取而代之的是 [slang-rhi](https://github.com/shader-slang/slang-rhi)。
此外,我们建议查看 [Vulkan Mini Examples](https://github.com/nvpro-samples/vk_mini_samples/),以获取更多关于在 Vulkan 上使用 Slang 语言特性(如指针和光线追踪内部函数)的示例。
## 限制与支持
### 平台支持
Slang 编译器和库可以在以下平台上构建:
| Windows | Linux | MacOS | WebAssembly |
|:---------:|:---------:|:---------:|:------------:|
| 受支持 | 受支持 | 受支持 | 实验性 |
Windows、Linux 和 MacOS 平台均支持 `x86_64` 和 `aarch64` 架构。
### 目标支持
Slang 可以将着色器代码编译为以下目标:
| 目标 | 状态 | 输出格式 |
|:-----------:|:-------------------------------------------------------------------------------------:|:----------------------------------------------------------------:|
| Direct3D 11 | [受支持](https://shader-slang.com/slang/user-guide/targets.html#direct3d-11) | HLSL |
| Direct3D 12 | [受支持](https://shader-slang.com/slang/user-guide/targets.html#direct3d-12) | HLSL |
| Vulkan | [受支持](https://shader-slang.com/slang/user-guide/targets.html#vulkan) | SPIRV, GLSL |
| Metal | [实验性*](https://shader-slang.com/slang/user-guide/targets.html#metal) | Metal Shading Language |
| WebGPU | 实验性** | WGSL |
| CUDA | [受支持](https://shader-slang.com/slang/user-guide/targets.html#cuda-and-optix) | C++ (仅计算) |
| Optix | [实验性](https://shader-slang.com/slang/user-guide/targets.html#cuda-and-optix) | C++ (开发中) |
| CPU | [实验性](https://shader-slang.com/slang/user-guide/targets.html#cpu-compute) | C++ (内核), C++ (主机), 独立可执行文件, 动态库 |
欲了解更多详情,请参阅 [User Guide](https://shader-slang.github.io/slang/user-guide/) 中的 [Supported Compilation
Targets](https://shader-slang.com/slang/user-guide/targets.html) 部分。
Slang 项目已用于生产应用程序和大型着色器代码库,但仍处于积极开发中。目前支持主要集中在 Slang 使用最频繁的平台(Windows、Linux)和目标 API(Direct3D 12、Vulkan)上。希望在其他平台或 API 上获得支持的用户应通过 issue 跟踪器与开发团队协调,以确保其用例能够得到支持。
## 许可证
Slang 代码本身采用 Apache 2.0 with LLVM Exception 许可证(参见 [LICENSE](LICENSE))。
核心 Slang 工具的构建依赖于以下项目(自动或可选),这些项目可能拥有自己的许可证:
* [`glslang`](https://github.com/KhronosGroup/glslang) (BSD)
* [`lz4`](https://github.com/lz4/lz4) (BSD)
* [`miniz`](https://github.com/richgel999/miniz) (MIT)
* [`spirv-headers`](https://github.com/KhronosGroup/SPIRV-Headers) (Modified MIT)
* [`spirv-tools`](https://github.com/KhronosGroup/SPIRV-Tools) (Apache 2.0)
* [`ankerl::unordered_dense::{map, set}`](https://github.com/martinus/unordered_dense) (MIT)
Slang 版本可能包含 [LLVM](https://github.com/llvm/llvm-project),其许可证为:
* [`llvm`](https://llvm.org/docs/DeveloperPolicy.html#new-llvm-project-license-framework) (Apache 2.0 License with LLVM exceptions)
随 Slang 构建的一些测试和示例程序使用以下项目,这些项目可能拥有自己的许可证:
* [`glm`](https://github.com/g-truc/glm) (MIT)
* 来自单文件库 [`stb`](https://github.com/nothings/stb) 集合的 `stb_image` 和 `stb_image_write` (公共领域)
* [`tinyobjloader`](https://github.com/tinyobjloader/tinyobjloader) (MIT)
标签:AI工具, CUDA, D3D12, GPU编程, HLSL, Metal, Slang, SPIR-V, Vectored Exception Handling, Vulkan, 代码生成, 凭据扫描, 图形学, 实时渲染, 模块化, 渗透测试工具, 游戏开发, 着色器, 神经图形学, 编译器, 自动微分, 计算机图形, 高性能计算