https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.htmlhtml
#pragma multi_compile Type_1 Type_2 Type_3 ...ui
这个指令将会生成多个Shader变体(variants),运行时根据材质或是全局的Keyword决定哪一个变体起效this
全部关键字都没有起效的话, 会选择第一个起效,因此通常是写 XXX_OFF XXX_ON 默认关闭某选项3d
#pragma multi_compile __ FOO_ONhtm
这种方式会少用一个关键字(总关键字数目有限制 256最大,内部已经用了大约60个)ip
#pragma shader_feature 和 #pragma multi_compile类似get
不一样的是shader_feature没有用到的不会被包含进去 multi_compile 所有版本都会被包含it
因此 shader_feature 材质用 multi_compile 代码控制用基础
#pragma shader_feature FANCY_STUFF 是 #pragma shader_feature _ FANCY_STUFF 的缩写unity3d
shader中判断
#ifdef Type_n
... ..
#endif
在脚本里用
Material.EnableKeyword 和 DisableKeyword
Shader.EnableKeyword 和 DisableKeyword
控制keyword起效
注意: 5.4中用Shader.EnableKeyword设置了全局使用默认的key, 用Material.EnableKeywor设置单个不使用默认值无效
用Shader.EnableKeyword设置了全局不使用默认的key, 用Material.EnableKeywor设置单个使用默认值起效
EnableKeyword 和 DisableKeyword 最好组合使用 好比一组有三个,必须写1个enable2个disable
#pragma multi_compile A B C
#pragma multi_compile D E
会生成6(3*2)个变体
用上面的方式并不能根据不一样的状况减小Pass,
能够用LOD属性控制SubShader的起效来手动的管理起效的Pass
把须要的基础Pass放在基础Shader中,用UsePass来组织须要起效的Pass
默认的ShaderLOD值为 200
Built-in shaders in Unity have their LODs set up this way:
来源: https://docs.unity3d.com/Manual/SL-ShaderLOD.html