陰影分層
将顔色按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"
}