天天看点

unity shader 着色器实例 代码+注释 【阴影分层换色】

阴影分层

将颜色按4个指定区域区分

Shader "Custom/testS"
{
   Properties
   {
       //定义主色以及三级阴影颜色
       _Color ("Color", Color) = (1,1,1,1)
       _ShadowColor1 ("Shadow Color1", Color) = (1,1,1,1)
       _ShadowColor2 ("Shadow Color2", Color) = (1,1,1,1)
       _ShadowColor3 ("Shadow Color3", Color) = (1,1,1,1)
   }
   SubShader
   {
       Tags { "RenderType"="Opaque"}
       LOD 200
       Pass{
           Cull Back
           CGPROGRAM
               #pragma vertex vert
               #pragma fragment frag
                   #include "Lighting.cginc"
                   #include "UnityCG.cginc"
                   #include "AutoLight.cginc" 
               
               #pragma target 3.0
               
               fixed4 _Color;
               fixed4 _ShadowColor1;
               fixed4 _ShadowColor2;
               fixed4 _ShadowColor3;
               
               struct a2v {
                   //顶点位置,法线与贴图
                   float4 vertex:POSITION;
                   float3 normal:NORMAL;
                   float2 texcoord:TEXCOORD0;
               };
                   
               struct v2f
               {
                   //传给片元数据
                   float4 pos:SV_POSITION;
                   float2 uv:TEXCOORD0;
                   float3 normal:TEXCOORD3;
                   float3 worldNormal:TEXCOORD1;
                   float3 worldPos:TEXCOORD2;
                   fixed4 color:COLOR;
               };
               
               v2f vert(a2v v){
                   //创建v2f数据 o
                   v2f o;                    
                   //获取顶点的裁剪坐标
                   o.pos = UnityObjectToClipPos(v.vertex);//将模型顶点坐标转换为裁剪坐标 //顶点法线 * 世界转模型法线  获取世界法线?
                   //获取单位法线向量,并将向量在模型坐标转化为模型位置
                   o.normal   = mul(v.normal,(float3x3)unity_WorldToObject);
                   //获取世界法线向量
                   o.worldNormal   = mul(v.normal,(float3x3)unity_ObjectToWorld);
                   //获取世界顶点
                   o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;  
                   o.color = _Color;     
                   return o;                
               } 
               
               bool InRange(float minv, float maxv, float value){
                   if(value < maxv && value > minv)
                       return true;
                   return false;    
               }
               fixed4 frag(v2f i) : COLOR{
                   //获取法线方向
                   float3 normalDir = normalize(i.normal);
                   //灯光方向
                   float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
                   //漫反射
                   float3 diffuse = _LightColor0.rgb * max(dot(normalDir,lightDir),0) * _Color;
                   //获取环境光
                   float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
                   //最终颜色
                   float4 g = float4(diffuse + ambient , 1);
                   //统一色彩
                   float v1 = 1;
                   float v2 = 1.5;
                   float v3 = 2;
// g = floor(g * 5)/5; 梯度
                   if(InRange(0.0,v1,g)){
                       g = _ShadowColor1;
                   }
                   if(InRange(v1,v2,g)){
                       g = _ShadowColor2;
                   }
                   if(InRange(v2,v3,g)){
                       g = _ShadowColor3;
                   }
                   return g;             
               }  
           ENDCG
       } 
       
    }
   FallBack "Diffuse"
}