用法
以multi_compile为例:
Variant.shader
Shader "My/Variant/Variant" { SubShader { //... Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile COLOR_DEFAULT COLOR_G //... v2f vert (appdata v) { //... } fixed4 frag (v2f i) : SV_Target { #if defined(COLOR_DEFAULT) return fixed4(1, 0, 0, 1); #elif defined(COLOR_G) return fixed4(0, 1, 0, 1); #endif } ENDCG } } }
大概原理
有点类似c/c++的条件编译,这个也是一个编译时特性。上面的文件经过shader编译器编译后,编译器会帮我们生成2个shader
1、Variant-COLOR_DEFAULT.shader
//其他代码省略... fixed4 frag (v2f i) : SV_Target { return fixed4(1, 0, 0, 1); }
2、Variant-COLOR_G.shader
//其他代码省略... fixed4 frag (v2f i) : SV_Target { return fixed4(0, 1, 0, 1); }
然后我们可以在c#中使用相关的api来控制使用哪个shader:
调用Shader.EnableKeyword("COLOR_DEFAULT")会使用Variant-COLOR_DEFAULT.shader
调用Shader.EnableKeyword("COLOR_G")会使用Variant-COLOR_G.shader
为什么要使用变体?
- 减少if else这种条件判断带来的性能损耗
- 将代码类似的多个shader合并成1个,减少维护成本
keyword的一些备忘
1) 默认第1个keyword开启
2) 只有1个keyword会开启
Shader.EnableKeyword("COLOR_DEFAULT");
Shader.EnableKeyword("COLOR_G");
上面的代码执行后:COLOR_DEFAULT会关掉,COLOR_G会开启
3) 必定有1个keyword会开启
Shader.DisableKeyword("COLOR_DEFAULT");
Shader.DisableKeyword("COLOR_G");
面的代码执行后:COLOR_DEFAULT开启shader Inspector面板来控制关键字
[KeywordEnum(DEFAULT, G)] _COLOR("Color", Float) = 0
其他特性
这边不做介绍了,网上很多教程
shader_feature
multi_compile_local
shader_feature_local
#pragma skip_variants POINT POINT_COOKIE
参考
unity shader 变种(多重编译 multi_compile)_子胤的博客-CSDN博客
Unity shader中的multi_compile和shader_feature宏定义_ShawnWeasley的博客-CSDN博客
Unity Shader - 使用multi_compile对Shader渲染质量控制_keywordenum_Jave.Lin的博客-CSDN博客
Unity #pragma multi_compile说明 - 00000000O - 博客园 (cnblogs.com)
Unity Shader multi_compile&shader_feature 变体_shaderfeature_lvcoc的博客-CSDN博客
Unity - Manual: Making multiple shader program variants (unity3d.com)
标签:multi,COLOR,shader,Shader,compile,DEFAULT,变体 From: https://www.cnblogs.com/sailJs/p/17359407.html