123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- Shader "Hidden/ShadowGroup2D"
- {
- Properties
- {
- _MainTex("Texture", 2D) = "white" {}
- _ShadowStencilGroup("__ShadowStencilGroup", Float) = 1.0
- }
- SubShader
- {
- Tags { "RenderType"="Opaque" }
- Cull Off
- BlendOp Add
- Blend One One
- ZWrite Off
- Pass
- {
- Stencil
- {
- Ref [_ShadowStencilGroup]
- Comp NotEqual
- Pass Replace
- Fail Keep
- }
- HLSLPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
- struct Attributes
- {
- float3 vertex : POSITION;
- float4 tangent: TANGENT;
- float2 uv : TEXCOORD0;
- float4 extrusion : COLOR;
- };
- struct Varyings
- {
- float4 vertex : SV_POSITION;
- float4 color : COLOR;
- float2 uv : TEXCOORD0;
- };
- sampler2D _MainTex;
- float4 _MainTex_ST;
- uniform float3 _LightPos;
- uniform float _ShadowRadius;
- Varyings vert (Attributes v)
- {
- Varyings o;
- float3 vertexWS = TransformObjectToWorld(v.vertex); // This should be in world space
- float3 lightDir = _LightPos - vertexWS;
- lightDir.z = 0;
- // Start of code to see if this point should be extruded
- float3 lightDirection = normalize(lightDir);
- float3 endpoint = vertexWS + (_ShadowRadius * -lightDirection);
- float3 worldTangent = TransformObjectToWorldDir(v.tangent.xyz);
- float sharedShadowTest = saturate(ceil(dot(lightDirection, worldTangent)));
- // Start of code to calculate offset
- float3 vertexWS0 = TransformObjectToWorld(float3(v.extrusion.xy, 0));
- float3 vertexWS1 = TransformObjectToWorld(float3(v.extrusion.zw, 0));
- float3 shadowDir0 = vertexWS0 - _LightPos;
- shadowDir0.z = 0;
- shadowDir0 = normalize(shadowDir0);
- float3 shadowDir1 = vertexWS1 -_LightPos;
- shadowDir1.z = 0;
- shadowDir1 = normalize(shadowDir1);
- float3 shadowDir = normalize(shadowDir0 + shadowDir1);
- float3 sharedShadowOffset = sharedShadowTest * _ShadowRadius * shadowDir;
- float3 position;
- position = vertexWS + sharedShadowOffset;
- o.vertex = TransformWorldToHClip(position);
- // RGB - R is shadow value (to support soft shadows), G is Self Shadow Mask, B is No Shadow Mask
- o.color = 1; // v.color;
- o.color.g = 0.5;
- o.color.b = 0;
- o.uv = TRANSFORM_TEX(v.uv, _MainTex);
- return o;
- }
- float4 frag (Varyings i) : SV_Target
- {
- float4 main = tex2D(_MainTex, i.uv);
- float4 col = i.color;
- col.g = main.a * col.g;
- return col;
- }
- ENDHLSL
- }
- Pass
- {
- Stencil
- {
- Ref [_ShadowStencilGroup]
- Comp NotEqual
- Pass Replace
- Fail Keep
- }
- HLSLPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
- struct Attributes
- {
- float3 vertex : POSITION;
- float2 uv : TEXCOORD0;
- };
- struct Varyings
- {
- float4 vertex : SV_POSITION;
- float4 color : COLOR;
- float2 uv : TEXCOORD0;
- };
- sampler2D _MainTex;
- float4 _MainTex_ST;
- Varyings vert (Attributes v)
- {
- Varyings o;
- o.vertex = TransformObjectToHClip(v.vertex);
- // RGB - R is shadow value (to support soft shadows), G is Self Shadow Mask, B is No Shadow Mask
- o.color = 1;
- o.color.g = 0.5;
- o.color.b = 1;
- o.uv = TRANSFORM_TEX(v.uv, _MainTex);
- return o;
- }
- half4 frag (Varyings i) : SV_Target
- {
- half4 main = tex2D(_MainTex, i.uv);
- half4 color = i.color;
- color.b = 1 - main.a;
- return color;
- }
- ENDHLSL
- }
- }
- }
|