we know that one shader which is decorated by the #pragma multi_compile will be compiled to more than one shader.
let me take an example.
Shader "Course/MultiCompileShader"
{
Properties
{
_firstTexture("fist texture", 2D)="white"{}
_secondTexture("second texture", 2D)="black"{}
}
SubShader
{
CGPROGRAM
#pragma surface surf Lambert
#pragma multi_compile FIRST_SHADER SECOND_SHADER
struct Input
{
float2 uv_firstTexture;
float2 uv_secondTexture;
};
sampler2D _firstTexture;
sampler2D _secondTexture;
void surf(Input IN, inout SurfaceOutput o)
{
#ifdef FIRST_SHADER
half4 tex = tex2D(_firstTexture, IN.uv_firstTexture);
o.Albedo += tex.rgb;
#endif
#ifdef SECOND_SHADER
half4 tex = tex2D(_secondTexture, IN.uv_secondTexture);
o.Albedo += tex.rgb;
#endif
}
ENDCG
}
}
from the above block code. we know that we prepare two pictures that are used to paste the surface of the object.
then we will write a C# script to control the key word FIRST_SHADER or SECOND_SHADER.
C# code like this:
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{
public void Update()
{
if(Input.GetKeyDown(KeyCode.A))
{
Shader.EnableKeyword("FIRST_SHADER");
Shader.DisableKeyword("SECOND_SHADER");
}
else if(Input.GetKeyDown(KeyCode.B))
{
Shader.EnableKeyword("SECOND_SHADER");
Shader.DisableKeyword("FIRST_SHADER");
}
}
}
in the update function, if u press A, we will use the first picture to render the object. if we press B we will use second picture to render the object. so we now understand the key word multi_compile and the Shader.EnableKeyWorld and Shader.DisableKeyword function.