shader变体
用法
以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");
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 } } }
shader Inspector面板来控制关键字
[KeywordEnum(DEFAULT, G)] _COLOR("Color", Float) = 0

其他特性
这边不做过多介绍,网上很多教程
shader_feature: 和multi_compile类似,只是没被用到的,不会生成变体
multi_compile_local: 和multi_compile区别是:只在单个shader生效
shader_feature_local: 和shader_feature的区别是:只在单个shader生效
#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)

浙公网安备 33010602011771号