You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.2 KiB

  1. Shader "Hidden/WorldReflectionVector"
  2. {
  3. Properties
  4. {
  5. _A ("_TangentNormal", 2D) = "white" {}
  6. }
  7. SubShader
  8. {
  9. Pass //not connected
  10. {
  11. CGPROGRAM
  12. #pragma vertex vert_img
  13. #pragma fragment frag
  14. #include "UnityCG.cginc"
  15. float4 frag(v2f_img i) : SV_Target
  16. {
  17. float2 xy = 2 * i.uv - 1;
  18. float z = -sqrt(1-saturate(dot(xy,xy)));
  19. float3 vertexPos = float3(xy, z);
  20. float3 normal = normalize(vertexPos);
  21. float3 worldNormal = UnityObjectToWorldNormal(normal);
  22. float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos);
  23. float3 worldRefl = -worldViewDir;
  24. worldRefl = reflect( worldRefl, worldNormal );
  25. return float4((worldRefl), 1);
  26. }
  27. ENDCG
  28. }
  29. Pass //connected
  30. {
  31. CGPROGRAM
  32. #pragma vertex vert_img
  33. #pragma fragment frag
  34. #include "UnityCG.cginc"
  35. sampler2D _A;
  36. float4 frag(v2f_img i) : SV_Target
  37. {
  38. float2 xy = 2 * i.uv - 1;
  39. float z = -sqrt(1-saturate(dot(xy,xy)));
  40. float3 vertexPos = float3(xy, z);
  41. float3 normal = normalize(vertexPos);
  42. float3 worldNormal = UnityObjectToWorldNormal(normal);
  43. float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x ));
  44. float3 worldPos = mul(unity_ObjectToWorld, float4(vertexPos,1)).xyz;
  45. float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos);
  46. float3 worldTangent = UnityObjectToWorldDir(tangent);
  47. float tangentSign = -1;
  48. float3 worldBinormal = normalize( cross(worldNormal, worldTangent) * tangentSign);
  49. float4 tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);
  50. float4 tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);
  51. float4 tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);
  52. float3 worldRefl = -worldViewDir;
  53. float2 sphereUVs = i.uv;
  54. sphereUVs.x = atan2(vertexPos.x, -vertexPos.z) / (UNITY_PI) + 0.5;
  55. // Needs further checking
  56. //float3 tangentNormal = tex2Dlod(_A, float4(sphereUVs,0,0)).xyz;
  57. float3 tangentNormal = tex2D(_A, sphereUVs).xyz;
  58. worldRefl = reflect( worldRefl, half3( dot( tSpace0.xyz, tangentNormal ), dot( tSpace1.xyz, tangentNormal ), dot( tSpace2.xyz, tangentNormal ) ) );
  59. return float4((worldRefl), 1);
  60. }
  61. ENDCG
  62. }
  63. }
  64. }