1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- Shader "Hidden/ScreenPosInputsNode"
- {
- SubShader
- {
- CGINCLUDE
- #include "UnityCG.cginc"
- #include "Preview.cginc"
- #pragma vertex vert_img
- #pragma fragment frag
- uniform float4 _ASEPreviewSize;
- inline float4 CalculateScreenPos( float2 uv, bool norm = true, float z = 0.01 )
- {
- float2 xy = 2 * uv - 1;
- float3 vertexPos = float3( xy, z );
- float4x4 P = float4x4( 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); //UNITY_MATRIX_P
- 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
- float4x4 M = unity_ObjectToWorld; //float4x4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1); //unity_ObjectToWorld
- float4x4 VPmatrix = mul( P, V );
- float4 clipPos = mul( VPmatrix, mul( M, float4( vertexPos, 1.0 ) ) ); //same as object to clip pos
- float4 screenPos = ComputeScreenPos( clipPos );
- screenPos = norm ? screenPos / screenPos.w : screenPos;
- return screenPos;
- }
- ENDCG
- // Normalized
- Pass
- {
- CGPROGRAM
- float4 frag( v2f_img i ) : SV_Target
- {
- return CalculateScreenPos( i.uv );
- }
- ENDCG
- }
- // Raw
- Pass
- {
- CGPROGRAM
- float4 frag( v2f_img i ) : SV_Target
- {
- return CalculateScreenPos( i.uv, false, 0.99 );
- }
- ENDCG
- }
- // Center
- Pass
- {
- CGPROGRAM
- float4 frag( v2f_img i ) : SV_Target
- {
- float4 screenPos = CalculateScreenPos( i.uv );
- return float4( screenPos.xy * 2 - 1, 0, 0 );
- }
- ENDCG
- }
- // Tiled
- Pass
- {
- CGPROGRAM
- float4 frag( v2f_img i ) : SV_Target
- {
- float4 screenPos = CalculateScreenPos( i.uv );
- return frac( float4( ( screenPos.x * 2 - 1 ) * _ASEPreviewSize.x / _ASEPreviewSize.y, screenPos.y * 2 - 1, 0, 0 ) );
- }
- ENDCG
- }
- // Screen
- Pass
- {
- CGPROGRAM
- float4 frag( v2f_img i ) : SV_Target
- {
- float4 screenPos = CalculateScreenPos( i.uv );
- screenPos.xy *= _ASEPreviewSize.xy;
- #if UNITY_UV_STARTS_AT_TOP
- screenPos.xy = float2( screenPos.x, ( _ProjectionParams.x < 0 ) ? _ASEPreviewSize.y - screenPos.y : screenPos.y );
- #else
- screenPos.xy = float2( screenPos.x, ( _ProjectionParams.x > 0 ) ? _ASEPreviewSize.y - screenPos.y : screenPos.y );
- #endif
- return float4( screenPos.xy, 0, 0 );
- }
- ENDCG
- }
- }
- }
|