Preview_ScreenPosInputsNode.shader 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. Shader "Hidden/ScreenPosInputsNode"
  2. {
  3. SubShader
  4. {
  5. CGINCLUDE
  6. #include "UnityCG.cginc"
  7. #include "Preview.cginc"
  8. #pragma vertex vert_img
  9. #pragma fragment frag
  10. uniform float4 _ASEPreviewSize;
  11. inline float4 CalculateScreenPos( float2 uv, bool norm = true, float z = 0.01 )
  12. {
  13. float2 xy = 2 * uv - 1;
  14. float3 vertexPos = float3( xy, z );
  15. float4x4 P = float4x4( 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); //UNITY_MATRIX_P
  16. float4x4 V = UNITY_MATRIX_V; //float4x4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1); //UNITY_MATRIX_V
  17. float4x4 M = unity_ObjectToWorld; //float4x4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1); //unity_ObjectToWorld
  18. float4x4 VPmatrix = mul( P, V );
  19. float4 clipPos = mul( VPmatrix, mul( M, float4( vertexPos, 1.0 ) ) ); //same as object to clip pos
  20. float4 screenPos = ComputeScreenPos( clipPos );
  21. screenPos = norm ? screenPos / screenPos.w : screenPos;
  22. return screenPos;
  23. }
  24. ENDCG
  25. // Normalized
  26. Pass
  27. {
  28. CGPROGRAM
  29. float4 frag( v2f_img i ) : SV_Target
  30. {
  31. return CalculateScreenPos( i.uv );
  32. }
  33. ENDCG
  34. }
  35. // Raw
  36. Pass
  37. {
  38. CGPROGRAM
  39. float4 frag( v2f_img i ) : SV_Target
  40. {
  41. return CalculateScreenPos( i.uv, false, 0.99 );
  42. }
  43. ENDCG
  44. }
  45. // Center
  46. Pass
  47. {
  48. CGPROGRAM
  49. float4 frag( v2f_img i ) : SV_Target
  50. {
  51. float4 screenPos = CalculateScreenPos( i.uv );
  52. return float4( screenPos.xy * 2 - 1, 0, 0 );
  53. }
  54. ENDCG
  55. }
  56. // Tiled
  57. Pass
  58. {
  59. CGPROGRAM
  60. float4 frag( v2f_img i ) : SV_Target
  61. {
  62. float4 screenPos = CalculateScreenPos( i.uv );
  63. return frac( float4( ( screenPos.x * 2 - 1 ) * _ASEPreviewSize.x / _ASEPreviewSize.y, screenPos.y * 2 - 1, 0, 0 ) );
  64. }
  65. ENDCG
  66. }
  67. // Screen
  68. Pass
  69. {
  70. CGPROGRAM
  71. float4 frag( v2f_img i ) : SV_Target
  72. {
  73. float4 screenPos = CalculateScreenPos( i.uv );
  74. screenPos.xy *= _ASEPreviewSize.xy;
  75. #if UNITY_UV_STARTS_AT_TOP
  76. screenPos.xy = float2( screenPos.x, ( _ProjectionParams.x < 0 ) ? _ASEPreviewSize.y - screenPos.y : screenPos.y );
  77. #else
  78. screenPos.xy = float2( screenPos.x, ( _ProjectionParams.x > 0 ) ? _ASEPreviewSize.y - screenPos.y : screenPos.y );
  79. #endif
  80. return float4( screenPos.xy, 0, 0 );
  81. }
  82. ENDCG
  83. }
  84. }
  85. }