#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