.hlsl 和 .cginc 文件切换代码分析上下文
.hlsl shader 文件可以通过使用预处理程序符号和 #if 语句,在编译时通过更改方法和数据结构的定义、可用性或实现来修改行为。 分析这些文件时,Rider 默认会使用自动上下文和默认定义的符号。 这可能导致 .hlsl 文件的部分被标记为非活动状态,无法使用 语法高亮显示、 代码补全、 检查等功能。
如果 .hlsl 文件被多个 .着色器 文件或一个 .着色器 文件中的多个 CGPROGRAM 块包含,则 Rider 可以在包含点使用相应上下文分析 .hlsl 文件。 可以在状态栏使用 Unity Shader 上下文选择器切换上下文:

例如,假设有一个 example.hlsl 文件,在定义了 FOO 符号与未定义时定义不同的方法。 在 Auto 上下文下,Rider 默认 FOO 未定义,并将该 #if 语句的第一个分支标记为非活动状态。 此上下文下定义了 bar 函数,任何对 foo 函数的调用都会导致未解析符号错误。
还假设有一个 Foo.shader 文件,定义多个 Shader 程序,并且每个 CGPROGRAM 块多次包含 example.hlsl。 每个 Shader 程序都有自己的上下文。 第一个程序从第 14 行开始,先定义 FOO 符号再包含 example.hlsl ,第二个程序从第 22 行开始定义 BAR ,然后再包含 HLSL 文件。
编辑 example.hlsl 时,可以通过点击上下文选择器,从弹窗中选择 Shader 程序的位置来切换上下文。 Rider 会显示 Auto 上下文,同时列出包含 example.hlsl 的位置。 如果选择 Foo.shader:14 ,Rider 将使用第 14 行 Foo.shader 中 CGPROGRAM shader 的上下文分析 example.hlsl 文件。 也就是说,会定义 FOO 符号,上面 #if 语句的第一个分支会变为有效,并且会定义 foo 函数。
