使用 Visual Studio Code 开发着色器
中级 程序员
Visual Studio Code 的 Stride Shader Tools 扩展为 SDSL 着色器开发提供语言服务器功能,包括智能代码补全和导航。
有关 SDSL 语言本身的信息,请参阅着色语言。有关在材质中使用着色器,请参阅自定义着色器。
功能特性
VS Code 扩展提供:
- SDSL(
.sdsl文件)的语法高亮 - 支持上下文感知补全的 IntelliSense
- 在专用侧边栏面板中可视化继承树
- 成员浏览器,显示所有可用的方法和变量
- 贯穿继承层次结构的转到定义
- 类型、方法和语义的悬停文档
- 解析错误和类型问题的实时诊断
- 与 RenderDoc 集成的着色器调试 (开发中)
安装与配置
前提条件
- Visual Studio Code 或 VSCodium
- .NET 8 SDK(如果未安装,扩展会提示你安装)
安装
- 打开 Visual Studio Code
- 安装 Stride Shader Tools 扩展:
- 打开扩展视图(Ctrl+Shift+X)并搜索 "Stride Shader Tools"
- 或直接从 VS Code Marketplace 或 OpenVSX(适用于 VSCodium 和其他替代品)安装
配置
扩展会自动从以下位置发现着色器:
- 你的工作区文件夹
%NUGET_PACKAGES%或~/.nuget/packages中的 Stride NuGet 包- vvvv gamma 安装(面向 vvvv 用户)
你可以在 VS Code 设置中添加自定义着色器目录:
- 打开设置(Ctrl+,)
- 搜索 "Stride Shader Tools"
- 在 Additional Shader Paths 中添加路径
IntelliSense 功能
上下文感知补全
扩展根据你当前的上下文提供智能补全:
继承的成员
当你从某个着色器类继承时,所有继承的方法和成员都会出现在补全列表中:
shader MyShader : ComputeColor
{
override float4 Compute()
{
// 输入 'base.' 查看所有基类方法
return base.Compute();
}
}
输入 override 可以查看继承层次结构中所有可重写的方法。
Streams
扩展会根据以下内容显示可用的 streams:
- 当前着色器阶段(顶点、像素、计算)
- 继承链中声明的 streams
- Stride 内置的 streams
shader MyVertexShader : ShaderBase, Transformation
{
stage void VSMain()
{
// 输入 'streams.' 查看所有可用的 streams
streams.Position = mul(streams.Position, World);
}
}
语义绑定
在着色器输入/输出声明中输入 : 之后,扩展会为有效的语义提供补全:
shader MyShader : ShaderBase
{
stage stream float4 Position : SV_Position;
// ^ 获取所有有效语义的补全
stage stream float2 TexCoord : TEXCOORD0;
// ^ 悬停查看文档
}
悬停在任意语义上可以查看:
- 该语义代表什么
- 它在哪些着色器阶段有效
- 使用示例
组合
声明组合时,扩展会显示实现了所需接口的所有着色器:
shader MyMaterial : MaterialPixelStream
{
compose ComputeColor diffuseMap;
// ^ 获取所有 ComputeColor 实现的建议
}
这有助于你发现兼容的着色器,而无需手动浏览文件。
转到定义
在任意着色器类、方法或成员上使用 Ctrl+单击(或 F12)即可跳转到其定义。这在继承层次结构中同样有效:
- 点击基类名称 → 跳转到基着色器文件
- 点击继承的方法 → 跳转到基类中的实现
- 点击 stream → 跳转到其声明位置
使用 Alt+Left 返回上一位置。
悬停信息
悬停在任意标识符上可以查看:
- 类型信息
- 方法签名
- 来自基类的文档
- 语义绑定说明
- 符号的定义位置
侧边栏面板
继承树
Inheritance Tree 面板显示你正在编辑的着色器的完整层次结构。这对于理解 Stride 着色器系统中复杂的继承链特别有用。
例如,在编辑材质着色器时,你可能会看到:
MyCustomMaterial
├─ MaterialPixelShadingStream
│ ├─ MaterialPixelStream
│ │ └─ ShaderBase
│ └─ ShadingBase
└─ NormalMapTexture
└─ ComputeColor
点击树中的任意着色器即可打开其源文件。
成员浏览器
Member Explorer 面板列出了着色器中所有可用的方法和变量,包括继承的成员。成员按以下方式分组:
- 方法 - 所有可调用的方法(包括已重写和继承的)
- 变量 - 阶段变量和 stream 变量
- 组合 - 组合声明
每个条目显示:
- 成员名称
- 其类型
- 定义它的着色器类(针对继承的成员)
- 它是否可重写
点击任意成员即可跳转到其定义。
处理继承
SDSL 使用具有特定解析规则的多重继承。该扩展帮助你驾驭这种复杂性。
理解方法解析
当多个基类定义了同一个方法时,最右侧的基类胜出。继承树可以清晰地展现这一点。
shader ShaderA : BaseA, BaseB, BaseC
{
// 如果 BaseA、BaseB 和 BaseC 都定义了 Compute(),
// 除非在此重写,否则将使用 BaseC 的实现
}
使用继承树可以查看完整的继承链,理解实际生效的是哪个实现。
重写方法
要重写某个方法:
- 在着色器类中输入
override - 从补全列表中选择要重写的方法
- 方法签名会自动插入
扩展会显示哪些方法可以重写,以及它们在层次结构中的定义位置。
调用基类实现
要调用某个方法的基类实现:
shader MyShader : ComputeColor
{
override float4 Compute()
{
float4 baseColor = base.Compute();
return saturate(baseColor * 2.0);
}
}
输入 base. 可以查看所有可用的基类方法。
最佳实践
先探索,再实现
在编写着色器之前:
- 使用转到定义探索基类
- 查看继承树以理解层次结构
- 查阅成员浏览器,了解已有哪些可用内容
- 决定哪些需要重写、哪些可以直接复用
这样可以避免重复劳动,并帮助你充分利用现有功能。
使用静态调用代替 include
SDSL 允许调用其他着色器中的静态函数,而无需 #include:
shader Utils
{
static float4 Invert(float4 color)
{
return float4(1.0 - color.rgb, color.a);
}
}
shader MyShader : ComputeColor
{
override float4 Compute()
{
return Utils.Invert(base.Compute());
}
}
扩展会为作用域内所有着色器中的静态函数提供补全。
善用悬停文档
当你对某个方法、语义或类型拿不准时:
- 悬停查看文档
- 查看签名和返回类型
- 使用转到定义查看实现
这样可以减少切换到外部文档的次数。
与 Visual Studio 的比较
Visual Studio 和 VS Code 都是 Stride 着色器开发的可行选择:
| 功能 | VS Code + 扩展 | Visual Studio + Stride 扩展 |
|---|---|---|
| 语法高亮 | ✅ SDSL | ✅ SDSL |
| 错误报告 | ✅ 实时 | ✅ 保存时 |
| 代码补全 | ✅ 上下文感知 | ⚠️ 基础 |
| 继承树 | ✅ 实时面板 | ❌ |
| 成员浏览器 | ✅ 带继承上下文 | ⚠️ 基础 |
| 转到定义 | ✅ 贯穿层次结构 | ⚠️ 有限 |
| 悬停文档 | ✅ 完整 | ⚠️ 有限 |
| 语义文档 | ✅ | ❌ |
| Game Studio 集成 | ⚠️ 外部 | ✅ 内置 |
| 资产重载 | ⚠️ 手动 | ✅ 自动 |
| 着色器调试 | 🔜 RenderDoc 集成 | ❌ |
如果你主要在 Game Studio 中工作,并希望与资产工作流紧密集成,Visual Studio 是最佳选择。
如果是以着色器为中心的开发,理解继承和获得上下文感知辅助至关重要,VS Code 是最佳选择。
许多开发者两者兼用:用 Game Studio 配合 Visual Studio 处理资产工作,用 VS Code 进行高强度的着色器开发。
故障排查
扩展未激活
打开 .sdsl 文件时扩展会激活。如果没有激活:
- 检查 Output 面板(View → Output),并从下拉菜单中选择 "Stride Shader Tools"
- 确认语言服务器正在运行
- 检查 Output 面板中是否有错误
补全不工作
如果 IntelliSense 不工作:
- 确保着色器文件位于有效的工作区文件夹中
- 检查文件格式是否正确(没有语法错误)
- 确认扩展已发现着色器路径(检查 Output 面板)
- 尝试重新加载窗口(Ctrl+Shift+P → "Reload Window")
继承树不显示
继承树要求:
- 有效的 SDSL 语法
- 至少声明了一个基类
- 该文件属于工作区的一部分
如果树为空,请检查文件中的语法错误。
另请参阅
- 自定义着色器 - 在材质中创建和使用着色器
- 着色语言 - SDSL 语言参考
- 着色器类、混入与继承 - 继承概念
- 组合 - 使用着色器组合
- Stride Shader Explorer - 浏览着色器层次结构的独立工具