#pragma multi_compile_fwdbase會增長不少個shader variants

#pragma multi_compile_fwdbase是unity內置的用於前向渲染的關鍵字快捷方式,它包含了前向渲染光照計算須要的大多數關鍵字,所以會被shader帶來不少的變體。ui

下面這個簡單的shader有8個變體:spa

Shader "James/Texture"
{
    Properties
    {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue"="Geometry" }
        LOD 200
        
        Pass
        {
            Tags { "LightMode"="ForwardBase" }
            Lighting Off
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase
            
            uniform sampler2D _MainTex;
            uniform half4 _MainTex_ST;

            struct vertexIN_base
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
            };
            
            struct v2f_base
            {
                float4 pos : SV_POSITION;
                half2  uv : TEXCOORD0;
            };

            v2f_base vert(vertexIN_base v)
            {
                v2f_base o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;

                return o; 
            }
            
            fixed4 frag(v2f_base i) : COLOR
            {
                return tex2D(_MainTex, i.uv);
            }
            ENDCG
        }
    }
    FallBack Off
}

咱們來看一下這些變體都有誰:code

// Total snippets: 1
// -----------------------------------------
// Snippet #0 platforms ffffffff:
Builtin keywords used: DIRECTIONAL DIRLIGHTMAP_COMBINED DYNAMICLIGHTMAP_ON LIGHTMAP_ON LIGHTMAP_SHADOW_MIXING LIGHTPROBE_SH SHADOWS_SCREEN SHADOWS_SHADOWMASK VERTEXLIGHT_ON

8 keyword variants used in scene:

DIRECTIONAL
DIRECTIONAL LIGHTPROBE_SH
DIRECTIONAL SHADOWS_SCREEN
DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN
DIRECTIONAL VERTEXLIGHT_ON
DIRECTIONAL LIGHTPROBE_SH VERTEXLIGHT_ON
DIRECTIONAL SHADOWS_SCREEN VERTEXLIGHT_ON
DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN VERTEXLIGHT_ON

而後咱們去掉multi_compile_fwdbase,看一下變體的狀況:orm

// Total snippets: 1
// -----------------------------------------
// Snippet #0 platforms ffffffff:

1 keyword variants used in scene:

<no keywords defined>

能夠看到這個shader就只會生成一個版本。blog

因此咱們在經過shader實現一些效果時,必定要謹慎使用這種內置的快捷方式,它會給shader帶來大量的變體,形成量大又沒必要要的浪費。ip

相關文章
相關標籤/搜索