// Upgrade NOTE: replaced '_Projector' with 'unity_Projector'
|
// Upgrade NOTE: replaced '_ProjectorClip' with 'unity_ProjectorClip'
|
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
|
|
#if !defined(DSP_PROJECTOR_CGINC_INCLUDED)
|
#define DSP_PROJECTOR_CGINC_INCLUDED
|
#include "UnityCG.cginc"
|
|
struct DSP_V2F_PROJECTOR {
|
float4 uvShadow : TEXCOORD0;
|
half2 alpha : COLOR; // fixed precision is ok for most GPU, but I saw a problem on Tegra 3.
|
UNITY_FOG_COORDS(1)
|
float4 pos : SV_POSITION;
|
};
|
|
struct DSP_V2F_PROJECTOR_LIGHT {
|
float4 uvShadow : TEXCOORD0;
|
half2 alpha : COLOR; // fixed precision is ok for most GPU, but I saw a problem on Tegra 3.
|
UNITY_FOG_COORDS(1)
|
float4 pos : SV_POSITION;
|
};
|
|
uniform float4x4 unity_Projector;
|
uniform float4x4 unity_ProjectorClip;
|
uniform float _ClipScale; // compatible with Fast Shadow Receiver
|
uniform fixed _Alpha; // compatible with Fast Shadow Receiver
|
uniform fixed _Ambient; // compatible with Fast Shadow Receiver
|
|
sampler2D _ShadowTex;
|
sampler2D _LightTex;
|
|
half DSPCalculateDiffuseLightAlpha(float4 vertex, float3 normal)
|
{
|
float diffuse = -dot(normal, normalize(float3(unity_Projector[2][0],unity_Projector[2][1], unity_Projector[2][2])));
|
return _Alpha * diffuse;
|
}
|
|
half DSPCalculateDiffuseShadowAlpha(float4 vertex, float3 normal)
|
{
|
float diffuse = -dot(normal, normalize(float3(unity_Projector[2][0],unity_Projector[2][1], unity_Projector[2][2])));
|
// this calculation is not linear. it is better to do in fragment shader. but in most case, it won't be a problem.
|
return _Alpha * diffuse / (_Ambient + saturate(diffuse));
|
}
|
|
DSP_V2F_PROJECTOR_LIGHT DSPProjectorVertLightNoFalloff(float4 vertex : POSITION, float3 normal : NORMAL)
|
{
|
DSP_V2F_PROJECTOR_LIGHT o;
|
o.pos = UnityObjectToClipPos (vertex);
|
o.uvShadow = mul (unity_Projector, vertex);
|
o.alpha.x = _ClipScale * mul(unity_ProjectorClip, vertex).x;
|
o.alpha.y = DSPCalculateDiffuseLightAlpha(vertex, normal);
|
UNITY_TRANSFER_FOG(o, o.pos);
|
return o;
|
}
|
|
DSP_V2F_PROJECTOR DSPProjectorVertNoFalloff(float4 vertex : POSITION, float3 normal : NORMAL)
|
{
|
DSP_V2F_PROJECTOR o;
|
o.pos = UnityObjectToClipPos (vertex);
|
o.uvShadow = mul (unity_Projector, vertex);
|
o.alpha.x = _ClipScale * mul(unity_ProjectorClip, vertex).x;
|
o.alpha.y = DSPCalculateDiffuseShadowAlpha(vertex, normal);
|
UNITY_TRANSFER_FOG(o, o.pos);
|
return o;
|
}
|
|
DSP_V2F_PROJECTOR_LIGHT DSPProjectorVertLightLinearFalloff(float4 vertex : POSITION, float3 normal : NORMAL)
|
{
|
DSP_V2F_PROJECTOR_LIGHT o;
|
o.pos = UnityObjectToClipPos (vertex);
|
o.uvShadow = mul (unity_Projector, vertex);
|
float z = mul(unity_ProjectorClip, vertex).x;
|
o.alpha.x = _ClipScale * z;
|
o.alpha.y = DSPCalculateDiffuseLightAlpha(vertex, normal) * (1.0f - z); // falloff
|
UNITY_TRANSFER_FOG(o, o.pos);
|
return o;
|
}
|
|
DSP_V2F_PROJECTOR DSPProjectorVertLinearFalloff(float4 vertex : POSITION, float3 normal : NORMAL)
|
{
|
DSP_V2F_PROJECTOR o;
|
o.pos = UnityObjectToClipPos (vertex);
|
o.uvShadow = mul (unity_Projector, vertex);
|
float z = mul(unity_ProjectorClip, vertex).x;
|
o.alpha.x = _ClipScale * z;
|
o.alpha.y = DSPCalculateDiffuseShadowAlpha(vertex, normal);
|
o.alpha.y *= (1.0f - z); // falloff
|
UNITY_TRANSFER_FOG(o, o.pos);
|
return o;
|
}
|
|
fixed DSPGetShadowAlpha(DSP_V2F_PROJECTOR i)
|
{
|
return saturate(saturate(i.alpha.x)*i.alpha.y);
|
}
|
|
fixed4 DSPCalculateFinalLightColor(fixed4 texColor, DSP_V2F_PROJECTOR_LIGHT i)
|
{
|
fixed alpha = saturate(saturate(i.alpha.x)*i.alpha.y);
|
texColor.rgb = lerp(fixed3(0,0,0), texColor.rgb, alpha);
|
UNITY_APPLY_FOG_COLOR(i.fogCoord, texColor, fixed4(0,0,0,0));
|
return texColor;
|
}
|
|
fixed4 DSPCalculateFinalShadowColor(fixed4 texColor, DSP_V2F_PROJECTOR i)
|
{
|
fixed alpha = DSPGetShadowAlpha(i);
|
texColor.rgb = lerp(fixed3(1,1,1), texColor.rgb, alpha);
|
UNITY_APPLY_FOG_COLOR(i.fogCoord, texColor, fixed4(1,1,1,1));
|
return texColor;
|
}
|
|
fixed4 DSPProjectorFrag(DSP_V2F_PROJECTOR i) : SV_Target
|
{
|
fixed4 shadow = tex2Dproj(_ShadowTex, UNITY_PROJ_COORD(i.uvShadow));
|
return DSPCalculateFinalShadowColor(shadow, i);
|
}
|
|
fixed4 DSPProjectorFragLight(DSP_V2F_PROJECTOR_LIGHT i) : SV_Target
|
{
|
fixed4 light = tex2Dproj(_LightTex, UNITY_PROJ_COORD(i.uvShadow));
|
return DSPCalculateFinalLightColor(light, i);
|
}
|
|
fixed4 DSPProjectorFragLightWithShadow(DSP_V2F_PROJECTOR_LIGHT i) : SV_Target
|
{
|
fixed4 light = tex2Dproj(_LightTex, UNITY_PROJ_COORD(i.uvShadow));
|
fixed3 shadow = tex2Dproj(_ShadowTex, UNITY_PROJ_COORD(i.uvShadow));
|
light.rgb *= shadow.rgb;
|
return DSPCalculateFinalLightColor(light, i);
|
}
|
#endif // !defined(DSP_PROJECTOR_CGINC_INCLUDED)
|