官方地址
https://docs.unity3d.com/cn/2022.2/Manual/SL-MultipleProgramVariants.html
变种用我自己的理解就是
能用程序控制的shader
举个例子
这里声明了 a b c d
四个变量(其实是开关 下面会说)
记住 #pragma multi_compile 必须放在 CGPROGRAM 下面
在c#程序里
Shader.EnableKeyword("D");
就可以了
点击shader文件
可以看到这里 点那个按钮 会自动编译shader并打开shader文件
在打开的文件里面你会找到
Keywords: A
Keywords: B
Keywords: C
Keywords: D
等内容
这里显示一共有多少个变体
也可以点show 他会告诉你具体有哪些
也会显示这些内容
加完以后 无法刷新 可以点击
重新加载
那如果这样声明呢
你会发现编译后的文件显示的是这样的
Keywords: A EE
Keywords: A FF
Keywords: B FF
Keywords: B EE
Keywords: C FF
Keywords: C EE
Keywords: D EE
Keywords: D FF
看见了没
他一共生成了 4 * 2 共计 8个
这就是unity 优化编译的方式
记住
指定的第一个关键字是默认生效的,即默认使用变体A和EE
shader_feature的话 作用是一样的
不过他会删除 没有材质引用过的shader
如果没引用过的 也可以放在下面这个地方
Always Included Shaders
你也可以
声明的时候用这个
__和字母中间有空格
这样只需占用一个变量位置
但依然是两个shader变体 一个是非A 一个是A
你可以用代码控制
Shader.EnableKeyword(“A”);
Shader.DisableKeyword(“A”);
如果代码不设置 那么默认就是非A
其实也可以 声明局部变量
#pragma multi_compile_local __ A
设置的时候需要用
Material.EnableKeyword
全局和局部声明了同样的名字
优先用局部的
var m = this.GetComponent<MeshRenderer>();
m.material.EnableKeyword("A");
关于keyworkd的限制
2022版unity是这么说的
官方文档看这里
https://docs.unity3d.com/cn/2022.2/Manual/shader-keywords.html#keyword-limits
Unity can use up to 4,294,967,294 global shader keywords. Individual shaders and compute shaders can use up to 65,534 local shader keywords. These totals include keywords used for variants, and keywords used for dynamic branching.
Every keyword declared in the shader source file and its dependencies count towards this limit. Dependencies include Passes that the shader includes with UsePass, and fallbacks.
If Unity encounters a shader keyword with the same name multiple times, it only counts towards the limit once.
If a shader uses more than 128 keywords in total, it incurs a small runtime performance penalty; therefore, it is best to keep the number of keywords low. Unity always reserves 4 keywords per shader.
反正就是节省点使用