天天看點

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"
}