JetBrains Rider 2026.1 Help

.hlsl 和 .cginc 文件切换代码分析上下文

.hlsl shader 文件可以通过使用预处理程序符号和 #if 语句,在编译时通过更改方法和数据结构的定义、可用性或实现来修改行为。 分析这些文件时,Rider 默认会使用自动上下文和默认定义的符号。 这可能导致 .hlsl 文件的部分被标记为非活动状态,无法使用 语法高亮显示代码补全检查等功能。

如果 .hlsl 文件被多个 .着色器 文件或一个 .着色器 文件中的多个 CGPROGRAM 块包含,则 Rider 可以在包含点使用相应上下文分析 .hlsl 文件。 可以在状态栏使用 Unity Shader 上下文选择器切换上下文:

状态栏中的 Unity Shader 上下文选择器

例如,假设有一个 example.hlsl 文件,在定义了 FOO 符号与未定义时定义不同的方法。 在 Auto 上下文下,Rider 默认 FOO 未定义,并将该 #if 语句的第一个分支标记为非活动状态。 此上下文下定义了 bar 函数,任何对 foo 函数的调用都会导致未解析符号错误。

#if defined(FOO) void foo() {} #else void bar() {} #endif

还假设有一个 Foo.shader 文件,定义多个 Shader 程序,并且每个 CGPROGRAM 块多次包含 example.hlsl。 每个 Shader 程序都有自己的上下文。 第一个程序从第 14 行开始,先定义 FOO 符号再包含 example.hlsl ,第二个程序从第 22 行开始定义 BAR ,然后再包含 HLSL 文件。

... CGPROGRAM // line 14 #pragma multi_compile FOO #include "example.hlsl" ENDCG ... CGPROGRAM // line 22 #pragma multi_compile BAR #include "example.hlsl" ENDCG ...

编辑 example.hlsl 时,可以通过点击上下文选择器,从弹窗中选择 Shader 程序的位置来切换上下文。 Rider 会显示 Auto 上下文,同时列出包含 example.hlsl 的位置。 如果选择 Foo.shader:14 ,Rider 将使用第 14 行 Foo.shaderCGPROGRAM shader 的上下文分析 example.hlsl 文件。 也就是说,会定义 FOO 符号,上面 #if 语句的第一个分支会变为有效,并且会定义 foo 函数。

上下文选择器弹窗,显示可用位置
2026年 5月 8日