Shader "Zon/Diffuse_shadow" {
SubShader {
pass{
Tags { "LightMode"="ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
#pragma multi_compile_fwdbase
#include "autolight.cginc"
struct v2f{
float4 pos:POSITION;
fixed4 color:COLOR;
LIGHTING_COORDS(0,1)
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);//把空间点转换到屏幕上显示,专业解释是modle space to clipe space
float3 N = normalize(v.normal);
float3 L = normalize(_WorldSpaceLightPos0);
N = mul(float4(N,0),_World2Object).xyz;
N = normalize(N);
float ndotl = saturate(dot(N,L));
o.color = _LightColor0 * ndotl;
float3 wpos = mul(_Object2World,v.vertex).xyz;
o.color.rgb += Shade4PointLights(
unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
unity_LightColor[0].rgb,unity_LightColor[1].rgb,
unity_LightColor[2].rgb,unity_LightColor[3].rgb,
unity_4LightAtten0,
wpos,N
);//开启点光源照射
TRANSFER_VERTEX_TO_FRAGMENT(o) //AutoLight.cginc封装的宏定义,使Shader能接受点光源阴影
return o;
}
fixed4 frag(v2f IN):COLOR
{
float atten = LIGHT_ATTENUATION(IN);
fixed4 col = (IN.color + UNITY_LIGHTMODEL_AMBIENT);//UNITY_LIGHTMODEL_AMBIENT环境光
col.rgb *= atten;
return col;
}
ENDCG
}
//=================================渲染点光源阴影通道
pass{
Tags { "LightMode"="ForwardAdd" }
blend one one //混合第一个通道渲染
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
#pragma multi_compile_fwdadd_fullshadows
#include "autolight.cginc"
struct v2f{
float4 pos:POSITION;
fixed4 color:COLOR;
LIGHTING_COORDS(0,1)
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);//把空间点转换到屏幕上显示,专业解释是modle space to clipe space
float3 N = normalize(v.normal);
float3 L = normalize(_WorldSpaceLightPos0);
N = mul(float4(N,0),_World2Object).xyz;
N = normalize(N);
float ndotl = saturate(dot(N,L));
o.color = _LightColor0 * ndotl;
float3 wpos = mul(_Object2World,v.vertex).xyz;
o.color.rgb += Shade4PointLights(
unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
unity_LightColor[0].rgb,unity_LightColor[1].rgb,
unity_LightColor[2].rgb,unity_LightColor[3].rgb,
unity_4LightAtten0,
wpos,N
);//开启点光源照射
TRANSFER_VERTEX_TO_FRAGMENT(o) //AutoLight.cginc封装的宏定义,使Shader能接受点光源阴影
return o;
}
fixed4 frag(v2f IN):COLOR
{
float atten = LIGHT_ATTENUATION(IN);
fixed4 col = (IN.color);
col.rgb *= atten;
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
Diffuse_shadow顶点着色点光源阴影实现
最新推荐文章于 2024-10-03 20:25:35 发布