93 lines
2.2 KiB
Plaintext
93 lines
2.2 KiB
Plaintext
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
|
|
}
|
|
}
|
|
}
|