// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
|
|
|
|
Shader "Fog Volume/Shadow Projector"
|
|
{
|
|
|
|
Properties
|
|
{
|
|
[NoScaleOffset]_MainTex("ShadowMap", 2D) = "white" {}
|
|
displacePower("light Displace intensity", range(.01,.3)) = 0.079
|
|
_ShadowColor("ShadowColor", Color)=(0,0,0,0)
|
|
_Cutoff("Alpha cutoff", Range(0,1)) = 0.01//TODO: Publish
|
|
}
|
|
SubShader
|
|
{ Tags{
|
|
"Queue" = "AlphaTest"
|
|
|
|
"IgnoreProjector" = "True"
|
|
"RenderType" = "NeverRenderMe"
|
|
}
|
|
Pass
|
|
{
|
|
Fog{ Mode Off }
|
|
|
|
Blend DstColor OneMinusSrcAlpha
|
|
Cull front
|
|
ZWrite Off
|
|
ZTest Always
|
|
Lighting Off
|
|
CGPROGRAM
|
|
#pragma target 3.0
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
|
|
|
|
#include "UnityCG.cginc"
|
|
|
|
struct v2f
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
half2 uv : TEXCOORD0;
|
|
float4 screenUV : TEXCOORD1;
|
|
float3 ray : TEXCOORD2;
|
|
half3 orientation : TEXCOORD3;
|
|
};
|
|
|
|
v2f vert(float3 v : POSITION)
|
|
{
|
|
v2f o;
|
|
o.pos = UnityObjectToClipPos(float4(v,1));
|
|
o.uv = v.xz + 0.5;
|
|
o.screenUV = ComputeScreenPos(o.pos);
|
|
//o.ray = mul(UNITY_MATRIX_MV, float4(v,1)).xyz * float3(-1,-1,1);
|
|
//5.6:
|
|
o.ray = UnityObjectToViewPos(float4(v, 1) ).xyz* float3(-1, -1, 1);
|
|
o.orientation = mul((float3x3)unity_ObjectToWorld, float3(0,1,0));
|
|
return o;
|
|
}
|
|
|
|
uniform float3 L;
|
|
sampler2D _MainTex, RT_OpacityBlur;
|
|
sampler2D_float _CameraDepthTexture;
|
|
half displacePower;
|
|
half _Cutoff;
|
|
half4 _ShadowColor;
|
|
fixed4 frag(v2f i) : COLOR0
|
|
{
|
|
i.ray = i.ray * (_ProjectionParams.z / i.ray.z);
|
|
float2 uv = i.screenUV.xy / i.screenUV.w;
|
|
// read depth and reconstruct world position
|
|
float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv);
|
|
depth = Linear01Depth(depth);
|
|
float4 vpos = float4(i.ray * depth,1);
|
|
float3 wpos = mul(unity_CameraToWorld, vpos).xyz;
|
|
float3 opos = mul(unity_WorldToObject, float4(wpos,1)).xyz;
|
|
clip(float3(0.5,0.5,0.5) - abs(opos.xyz));
|
|
i.uv = opos.xz + 0.5;
|
|
i.uv = i.uv + displacePower*L.xz;
|
|
fixed4 col = tex2D(RT_OpacityBlur, i.uv).r;
|
|
clip(col.a - _Cutoff);
|
|
col.rgb = _ShadowColor*( col.a);
|
|
//return float4(0,0,0,1);
|
|
return float4(col.rgb, col.a);
|
|
}
|
|
ENDCG
|
|
}
|
|
|
|
}
|
|
|
|
Fallback Off
|
|
}
|