ShaderVariant
在shader最终编译时,根据上层的宏定义,根据不同的组合编译出多套底层shader.
Unity的Shader中通过multi_compile和shader_feature来定义宏(keyword)。最终编译的时候也是根据这些宏来编译成多种组合形式的Shader源码。其中每一种组合就是这个Uniy Shader的一个Variant
Material与ShaderVariant的关系
一个Material同一时刻只能对应它所使用的Shader的一个variant。进行切换的要使用Material.EnableKeyword()和Material.DisableKeyword()来开关对应的宏,
Unity会根据你设定的组合来匹配响应的shader variant进行渲染
Shader.EnableKeyword,和Shader.DisableKeyword是对Shader进行全局宏设置
built-in Shader的源码中的StandardShaderGUI.cs可以看到unity是怎么处理对于StandardShader的keyword设置的
multi_compile和shader_feature的区别
如果你在shader中添加了
#pragma multi_compile _A _B
#pragma multi_compile _C _D
那么无论这些宏是否真的被用到,你的shader都会被Unity编译成四个variant,分别包含了_A _C,_A _D, _B _C,_B _D四种keyword组合的代码
如果是
#pragma shader_feature _A _B