shader变体

发布时间 2023-05-02 15:42:10作者: yanghui01

用法

以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)