這個指令將會生成多個Shader變體(variants),運行時根據材質或是全局的Keyword決定哪個變體起效
所有關鍵字都沒有起效的話, 會選擇第一個起效,所以一般是寫 XXX_OFF XXX_ON 默認關閉某選項
#pragma multi_compile __ FOO_ON
這種方式會少用一個關鍵字(總關鍵字數目有限制 256最大,內部已經用了大約60個)
#pragma shader_feature 和 #pragma multi_compile相似
不同的是shader_feature沒有用到的不會被包含進去 multi_compile 全部版本都會被包含
所以 shader_feature 材質用 multi_compile 代碼控制用
#pragma shader_feature FANCY_STUFF 是 #pragma shader_feature _ FANCY_STUFF 的縮寫
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:
- VertexLit kind of shaders = 100
- Decal, Reflective VertexLit = 150
- Diffuse = 200
- Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
- Bumped, Specular = 300
- Bumped Specular = 400
- Parallax = 500
- Parallax Specular = 600