使用自定义特性关键字,可以动态对Shader某一部分代码进行开关操作
shader(定义了KEYWORD1特性):
定义:#pragma shader_feature KEYWORD1
判断:#ifdef KEYWORD1
Shader "Custom/NewSurfaceShader" {
Properties {
_Color ("Color", Color) = (,,,)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(,)) = 0.5
_Metallic ("Metallic", Range(,)) = 0.0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows // Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0 #pragma shader_feature KEYWORD1 sampler2D _MainTex; struct Input {
float2 uv_MainTex;
}; half _Glossiness;
half _Metallic;
fixed4 _Color; void surf (Input IN, inout SurfaceOutputStandard o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
#ifdef KEYWORD1
o.Albedo = float3(,,);
#else
o.Albedo = float3(,,);
#endif
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
脚本:
using UnityEngine;
using System.Collections; public class ShaderKeywordTest : MonoBehaviour
{
public Material mat; void OnEnable()
{
mat.EnableKeyword("KEYWORD1");
} void OnDisable()
{
mat.DisableKeyword("KEYWORD1");
}
}
测试效果如下: