UMP-EquirectangularCanvas.shader 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2. Shader "UMP/Equirectangular"
  3. {
  4. Properties
  5. {
  6. _MainTex("Video Texture", 2D) = "gray" {}
  7. _Color("Tint", Color) = (1,1,1,1)
  8. _Rotation("Rotation", Float) = 0
  9. }
  10. SubShader
  11. {
  12. Pass
  13. {
  14. Tags{ "LightMode" = "Always" }
  15. Cull Front
  16. CGPROGRAM
  17. #pragma vertex vert
  18. #pragma fragment frag
  19. #pragma fragmentoption ARB_precision_hint_fastest
  20. #pragma glsl
  21. #pragma target 3.0
  22. #include "UnityCG.cginc"
  23. struct appdata
  24. {
  25. float4 vertex : POSITION;
  26. float3 normal : NORMAL;
  27. };
  28. struct v2f
  29. {
  30. float4 pos : SV_POSITION;
  31. float3 normal : TEXCOORD0;
  32. };
  33. v2f vert(appdata v)
  34. {
  35. v2f o;
  36. o.pos = UnityObjectToClipPos(v.vertex);
  37. o.normal = v.normal;
  38. return o;
  39. }
  40. sampler2D _MainTex;
  41. float4 _MainTex_ST;
  42. fixed4 _Color;
  43. float _Rotation;
  44. inline float2 RadialCoords(float3 a_coords)
  45. {
  46. const float Deg2Rad = (UNITY_PI * 2.0) / 360.0;
  47. float rotationRadians = _Rotation * Deg2Rad;
  48. float3 a_coords_n = normalize(a_coords);
  49. float lon = -atan2(a_coords_n.z, a_coords_n.x) + rotationRadians;
  50. float lat = acos(a_coords_n.y);
  51. float2 sphereCoords = float2(lon, lat) * (1.0 / UNITY_PI);
  52. return float2(sphereCoords.x * 0.5 + 0.5, 1 - sphereCoords.y);
  53. }
  54. float4 frag(v2f IN) : COLOR
  55. {
  56. float2 equiUV = TRANSFORM_TEX(RadialCoords(IN.normal), _MainTex);
  57. return tex2D(_MainTex, equiUV) * _Color;
  58. }
  59. ENDCG
  60. }
  61. }
  62. FallBack "VertexLit"
  63. }