真正支持unity shaderlab补全的是shaderlabvscode(free)(id: lingbaoer.shaderlab-vscode),它支持.properties关键字、unity内置函数、struct成员及fallback名称补全,需确保文件语言模式设为shaderlab且正确包含如unitycg.cginc等头文件。

VS Code 装哪个插件才真正支持 ShaderLab 补全?
只装 Shader languages support for VS Code(tcwrens.shader-language-support)是不够的——它只做基础高亮,不识别 Unity 内置变量(如 _Time、unity_ObjectToWorld)、不提示 #pragma 指令、也不补全 CGPROGRAM 块内的函数。真正能用的组合只有一个:ShaderlabVSCode(Free)(ID: lingbaoer.shaderlab-vscode)。
这个插件是目前唯一公开维护、明确适配 Unity 2020+ 的 ShaderLab 专用扩展,支持:.shader、.cginc、.hlsl、.compute 文件;自动补全 Properties 块关键字、Unity 内置函数签名、struct 成员、甚至 FallBack 后备 Shader 名称。
- 别被名字误导:叫 “VSCode” 但和 Visual Studio 无关,纯 VS Code 插件
- 安装后无需额外配置,打开任意
.shader文件立即生效 - 如果补全没弹出,检查是否误启用了其他 GLSL/HLSL 插件(比如
GLSL Language Support),它们会抢夺语言模式绑定
为什么 _MainTex 还是标红、跳转不到定义?
VS Code 本身不解析 Unity 的 Shader 属性注册机制,_MainTex 这类变量不是“声明在代码里”,而是由 Unity 编译器在构建时注入的。所以标红是正常现象,不是插件失效。
真正要关心的是:悬停能否显示提示、补全是否列出 tex2D 或 UNITY_MATRIX_MVP 这类 Unity 特有符号。如果不能,问题大概率出在语言模式没正确激活:
- 打开
.shader文件后,右下角状态栏应显示 “ShaderLab” —— 如果显示 “Plain Text” 或 “GLSL”,点击它手动选为 ShaderLab - 确保文件后缀确实是
.shader;.cg或.hlsl文件需单独配置语言模式(Ctrl+Shift+P → “Change Language Mode” → 选 HLSL) -
ShaderlabVSCode不处理 C# 逻辑,所以Material.SetTexture("_MainTex", ...)中的字符串不会被反向关联到 Shader 属性
补全列表里为什么没有 UnityObjectToClipPos?
这个函数实际定义在 UnityCG.cginc 里,而 ShaderlabVSCode 的补全依赖于你是否显式 #include 了对应头文件。它不会全局扫描所有 Unity 内置 include 路径。
实操建议:
- 在
CGPROGRAM块顶部写上#include "UnityCG.cginc",保存后补全立刻出现UnityObjectToClipPos、UnityWorldToClipPos等函数 - 同理,要用
GetMeshLightData就得#include "Lighting.cginc" - 插件不模拟预处理器行为,所以条件编译块(
#ifdef UNITY_EDITOR)内的函数不会进入补全范围
格式化后缩进错乱或大括号换行异常
ShaderlabVSCode 自带的格式化器对嵌套结构(尤其是 CGPROGRAM / ENDCG 和 SubShader / Pass)支持有限,容易把 CGPROGRAM 块内 HLSL 代码按 ShaderLab 规则缩进,导致语法错误。
稳妥做法是禁用它的格式化,改用更可控的方式:
- 在 VS Code 设置中搜索
shaderlab format,关闭Shaderlab > Format: Enable - 对 HLSL 部分,单独启用
HLSL插件(如HLSL Language)并设置"files.associations": {"*.hlsl": "hlsl"} - 手动缩进时记住:ShaderLab 主体用 2 空格(Unity 官方风格),
CGPROGRAM块内 HLSL 用 4 空格 —— 混用空格数反而比不格式化更易出错
最常被忽略的一点:插件无法感知 Unity 版本差异。Unity 2021+ 废弃了 CGPROGRAM,转向 HLSLPROGRAM,但 ShaderlabVSCode 当前版本(v1.3.2)尚未更新对 HLSLPROGRAM 块的补全支持,遇到新项目得手动补全函数名,或降级回 CGPROGRAM 兼容模式。











