Advertisement
Guest User

Untitled

a guest
Sep 27th, 2021
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.28 KB | None | 0 0
  1. struct vtf
  2.     {
  3.         float4 position: SV_POSITION;
  4.         float2 uv: TEXCOORD0;
  5.     };
  6.     float4 _DirLightDirection;
  7.     vtf vert(appdata_Shadow v)
  8.     {
  9.         vtf i;
  10.         float3 normal = normalize(_DirLightDirection);
  11.         float3 tangent = VerticalBillboardTangent(normal);
  12.         float4 ShadowCastPos = VerticalBillboardWorld(v.vertex, normal, tangent);
  13.         float4 ShadowCastClipPos = mul(unity_MatrixVP, ShadowCastPos);
  14.  
  15.         float3 cameraNormal = VerticalBillboardNormal(_WorldSpaceCameraPos);
  16.         float3 cameraTangent = VerticalBillboardTangent(cameraNormal);
  17.         float4 cameraWorld = VerticalBillboardWorld(v.vertex, cameraNormal, cameraTangent);
  18.  
  19.  
  20.         //replace wPos with cameraWorld
  21.         float4 wPos = ShadowCastPos;
  22.         if (unity_LightShadowBias.z != 0.0)
  23.         {
  24.             //replace normal with cameraNormal to get camera facing shadows
  25.             float3 wNormal = UnityObjectToWorldNormal(normal);
  26.             float3 wLight = normalize(UnityWorldSpaceLightDir(wPos.xyz));
  27.  
  28.             float shadowCos = dot(wNormal, wLight);
  29.             float shadowSine = sqrt(1 - shadowCos * shadowCos);
  30.             float normalBias = unity_LightShadowBias.z * shadowSine;
  31.  
  32.             wPos.xyz -= wNormal * normalBias;
  33.         }
  34.         i.position = mul(UNITY_MATRIX_VP, wPos);
  35.  
  36.         //This is the original
  37.         //i.position = UnityClipSpaceShadowCasterPos(ShadowCastClipPos);
  38.  
  39.         i.position = UnityApplyLinearShadowBias(i.position);
  40.         i.uv = v.uv;
  41.         return i;
  42.     }
  43.  
  44.     half4 frag(vtf v): SV_TARGET
  45.     {
  46.         //clip(tex2D(_MainTex, v.uv).a - 0.5);
  47.         return 0;
  48.     }
  49. float3 VerticalBillboardNormal(float3 target)
  50. {
  51.     return normalize(target - mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz);
  52. }
  53. float3 VerticalBillboardTangent(float3 normal){
  54.     return cross(normal, float3(0, 1, 0));
  55. }
  56.  
  57. float4 VerticalBillboardWorld(float4 vertex, float3 normal, float3 tangent)
  58. {
  59.     float yawCamera = atan2(tangent.x, normal.x) - UNITY_PI / 2;//Add 90 for quads to face towards camera
  60.     float s, c;
  61.     sincos(yawCamera, s, c);
  62.  
  63.     float3x3 transposed = transpose((float3x3)unity_ObjectToWorld);
  64.     float3 scale = float3(length(transposed[0]), length(transposed[1]), length(transposed[2]));
  65.  
  66.     float3x3 newBasis = float3x3(
  67.         float3(c * scale.x, 0, s * scale.z),
  68.         float3(0, scale.y, 0),
  69.         float3(-s * scale.x, 0, c * scale.z)
  70.     );//Rotate yaw to point towards camera, and scale by transform.scale
  71.  
  72.     float4x4 objectToWorld = unity_ObjectToWorld;
  73.     //Overwrite basis vectors so the object rotation isn't taken into account
  74.     objectToWorld[0].xyz = newBasis[0];
  75.     objectToWorld[1].xyz = newBasis[1];
  76.     objectToWorld[2].xyz = newBasis[2];
  77.     //Now just normal MVP multiply, but with the new objectToWorld injected in place of matrix M
  78.     return mul(objectToWorld, vertex);
  79.  
  80.     // worldPos = mul(objectToWorld, vertex).xyz;
  81.     // return mul(UNITY_MATRIX_VP, mul(objectToWorld, vertex));
  82. }
  83. float4 VerticalBillboard(float3 target, float4 vertex)
  84. {
  85.     float3 normal = VerticalBillboardNormal(target);
  86.     float3 tangent = VerticalBillboardTangent(normal);
  87.     float4 world = VerticalBillboardWorld(vertex, normal, tangent);
  88.     return mul(UNITY_MATRIX_VP, world);
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement