1、三个球体,第一个使用的是自定义的shader,后两个使用的是系统默认的shader,一个是5.0之前的,一个是5.0之后的。开启平行光的阴影,自定义的shader没有投影
添加点光源后,平面使用standard着色器,可以同时接收点光源和平行光的阴影,就是有两个影子
但是当平面改为以前4.0之前的Legacy着色器之后,平面就只能接收到平行光的影子。就是虽然有两个光源:平行光和点光源,但是只有一个影子
总结:我们自己的着色器是没有投射阴影的。说明需要在着色器中编写功能。如果要接收阴影,如果要使用传统的legacy着色器,只能接收方向光的阴影,使用standard标准着色器,既可以接收方向光又可以接收点光源的阴影。
2、使用传统的着色器接收点光源的阴影
File-->Build Settings-->Player Settings
地板使用了4.0之前的shader
PlayerSettings中,默认的rendering path叫做Forward,需要改为使用延迟光照Legacy defered
3、对方向光产生了阴影的投射
添加阴影的tag
Shader "Custom/f_shadow" {
SubShader{
pass {
tags{"lightmode"="shadowcaster"}
}
pass {
tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
struct v2f {
float4 pos:POSITION;
float3 normal:NORMAL;
float4 vertex:COLOR;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
//原始的法向量
o.normal = v.normal;
//原始的光向量
o.vertex = v.vertex;
return o;
}
fixed4 frag(v2f IN) :COLOR{
//Ambient color
fixed4 col = UNITY_LIGHTMODEL_AMBIENT;
float3 N = UnityObjectToWorldNormal(IN.normal);
float3 L = normalize(WorldSpaceLightDir(IN.vertex));
//Diffuse Color
//dot(n,l)确定漫反射的强度问题
float diffuseScale = saturate(dot(N,L));
col += _LightColor0*diffuseScale;
return col;
}
ENDCG
}
}
}
4、添加点光源的投影
去掉tag为shadow的pass通道,添加fallback进行回滚
Shader "Custom/f_shadow" {
SubShader{
//pass {
// tags{"lightmode"="shadowcaster"}
//}
pass {
tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
struct v2f {
float4 pos:POSITION;
float3 normal:NORMAL;
float4 vertex:COLOR;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
//原始的法向量
o.normal = v.normal;
//原始的光向量
o.vertex = v.vertex;
return o;
}
fixed4 frag(v2f IN) :COLOR{
//Ambient color
fixed4 col = UNITY_LIGHTMODEL_AMBIENT;
float3 N = UnityObjectToWorldNormal(IN.normal);
float3 L = normalize(WorldSpaceLightDir(IN.vertex));
//Diffuse Color
//dot(n,l)确定漫反射的强度问题
float diffuseScale = saturate(dot(N,L));
col += _LightColor0*diffuseScale;
return col;
}
ENDCG
}
}
fallback "Diffuse"
}