#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