Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct vtf
- {
- float4 position: SV_POSITION;
- float2 uv: TEXCOORD0;
- };
- float4 _DirLightDirection;
- vtf vert(appdata_Shadow v)
- {
- vtf i;
- float3 normal = normalize(_DirLightDirection);
- float3 tangent = VerticalBillboardTangent(normal);
- float4 ShadowCastPos = VerticalBillboardWorld(v.vertex, normal, tangent);
- float4 ShadowCastClipPos = mul(unity_MatrixVP, ShadowCastPos);
- float3 cameraNormal = VerticalBillboardNormal(_WorldSpaceCameraPos);
- float3 cameraTangent = VerticalBillboardTangent(cameraNormal);
- float4 cameraWorld = VerticalBillboardWorld(v.vertex, cameraNormal, cameraTangent);
- //replace wPos with cameraWorld
- float4 wPos = ShadowCastPos;
- if (unity_LightShadowBias.z != 0.0)
- {
- //replace normal with cameraNormal to get camera facing shadows
- float3 wNormal = UnityObjectToWorldNormal(normal);
- float3 wLight = normalize(UnityWorldSpaceLightDir(wPos.xyz));
- float shadowCos = dot(wNormal, wLight);
- float shadowSine = sqrt(1 - shadowCos * shadowCos);
- float normalBias = unity_LightShadowBias.z * shadowSine;
- wPos.xyz -= wNormal * normalBias;
- }
- i.position = mul(UNITY_MATRIX_VP, wPos);
- //This is the original
- //i.position = UnityClipSpaceShadowCasterPos(ShadowCastClipPos);
- i.position = UnityApplyLinearShadowBias(i.position);
- i.uv = v.uv;
- return i;
- }
- half4 frag(vtf v): SV_TARGET
- {
- //clip(tex2D(_MainTex, v.uv).a - 0.5);
- return 0;
- }
- float3 VerticalBillboardNormal(float3 target)
- {
- return normalize(target - mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz);
- }
- float3 VerticalBillboardTangent(float3 normal){
- return cross(normal, float3(0, 1, 0));
- }
- float4 VerticalBillboardWorld(float4 vertex, float3 normal, float3 tangent)
- {
- float yawCamera = atan2(tangent.x, normal.x) - UNITY_PI / 2;//Add 90 for quads to face towards camera
- float s, c;
- sincos(yawCamera, s, c);
- float3x3 transposed = transpose((float3x3)unity_ObjectToWorld);
- float3 scale = float3(length(transposed[0]), length(transposed[1]), length(transposed[2]));
- float3x3 newBasis = float3x3(
- float3(c * scale.x, 0, s * scale.z),
- float3(0, scale.y, 0),
- float3(-s * scale.x, 0, c * scale.z)
- );//Rotate yaw to point towards camera, and scale by transform.scale
- float4x4 objectToWorld = unity_ObjectToWorld;
- //Overwrite basis vectors so the object rotation isn't taken into account
- objectToWorld[0].xyz = newBasis[0];
- objectToWorld[1].xyz = newBasis[1];
- objectToWorld[2].xyz = newBasis[2];
- //Now just normal MVP multiply, but with the new objectToWorld injected in place of matrix M
- return mul(objectToWorld, vertex);
- // worldPos = mul(objectToWorld, vertex).xyz;
- // return mul(UNITY_MATRIX_VP, mul(objectToWorld, vertex));
- }
- float4 VerticalBillboard(float3 target, float4 vertex)
- {
- float3 normal = VerticalBillboardNormal(target);
- float3 tangent = VerticalBillboardTangent(normal);
- float4 world = VerticalBillboardWorld(vertex, normal, tangent);
- return mul(UNITY_MATRIX_VP, world);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement