mirror of
https://github.com/FriendshipIsEpic/FiE-Game.git
synced 2024-11-25 23:17:58 +01:00
257 lines
6.9 KiB
Text
257 lines
6.9 KiB
Text
Shader "Hidden/Post FX/Builtin Debug Views"
|
|
{
|
|
CGINCLUDE
|
|
|
|
#include "UnityCG.cginc"
|
|
#include "Common.cginc"
|
|
|
|
#pragma exclude_renderers d3d11_9x
|
|
|
|
sampler2D_float _CameraDepthTexture;
|
|
sampler2D_float _CameraDepthNormalsTexture;
|
|
sampler2D_float _CameraMotionVectorsTexture;
|
|
|
|
float4 _CameraDepthTexture_ST;
|
|
float4 _CameraDepthNormalsTexture_ST;
|
|
float4 _CameraMotionVectorsTexture_ST;
|
|
|
|
#if SOURCE_GBUFFER
|
|
sampler2D _CameraGBufferTexture2;
|
|
float4 _CameraGBufferTexture2_ST;
|
|
#endif
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Depth
|
|
|
|
float _DepthScale;
|
|
|
|
float4 FragDepth(VaryingsDefault i) : SV_Target
|
|
{
|
|
float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv, _CameraDepthTexture_ST));
|
|
depth = Linear01Depth(depth) * _DepthScale;
|
|
float3 d = depth.xxx;
|
|
|
|
#if !UNITY_COLORSPACE_GAMMA
|
|
d = GammaToLinearSpace(d);
|
|
#endif
|
|
|
|
return float4(d, 1.0);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Normals
|
|
|
|
float3 SampleNormal(float2 uv)
|
|
{
|
|
#if SOURCE_GBUFFER
|
|
float3 norm = tex2D(_CameraGBufferTexture2, uv).xyz * 2.0 - 1.0;
|
|
return mul((float3x3)unity_WorldToCamera, norm);
|
|
#else
|
|
float4 cdn = tex2D(_CameraDepthNormalsTexture, uv);
|
|
return DecodeViewNormalStereo(cdn) * float3(1.0, 1.0, -1.0);
|
|
#endif
|
|
}
|
|
|
|
float4 FragNormals(VaryingsDefault i) : SV_Target
|
|
{
|
|
float3 n = SampleNormal(UnityStereoScreenSpaceUVAdjust(i.uv, _CameraDepthNormalsTexture_ST));
|
|
|
|
#if UNITY_COLORSPACE_GAMMA
|
|
n = LinearToGammaSpace(n);
|
|
#endif
|
|
|
|
return float4(n, 1.0);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Motion vectors
|
|
|
|
float _Opacity;
|
|
float _Amplitude;
|
|
float4 _Scale;
|
|
|
|
float4 FragMovecsOpacity(VaryingsDefault i) : SV_Target
|
|
{
|
|
float4 src = tex2D(_MainTex, i.uv);
|
|
return float4(src.rgb * _Opacity, src.a);
|
|
}
|
|
|
|
// Convert a motion vector into RGBA color.
|
|
float4 VectorToColor(float2 mv)
|
|
{
|
|
float phi = atan2(mv.x, mv.y);
|
|
float hue = (phi / UNITY_PI + 1.0) * 0.5;
|
|
|
|
float r = abs(hue * 6.0 - 3.0) - 1.0;
|
|
float g = 2.0 - abs(hue * 6.0 - 2.0);
|
|
float b = 2.0 - abs(hue * 6.0 - 4.0);
|
|
float a = length(mv);
|
|
|
|
return saturate(float4(r, g, b, a));
|
|
}
|
|
|
|
float4 FragMovecsImaging(VaryingsDefault i) : SV_Target
|
|
{
|
|
float4 src = tex2D(_MainTex, i.uv);
|
|
|
|
float2 mv = tex2D(_CameraMotionVectorsTexture, i.uv).rg * _Amplitude;
|
|
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
mv.y *= -1.0;
|
|
#endif
|
|
|
|
float4 mc = VectorToColor(mv);
|
|
|
|
float3 rgb = src.rgb;
|
|
|
|
#if !UNITY_COLORSPACE_GAMMA
|
|
rgb = LinearToGammaSpace(rgb);
|
|
#endif
|
|
|
|
rgb = lerp(rgb, mc.rgb, mc.a * _Opacity);
|
|
|
|
#if !UNITY_COLORSPACE_GAMMA
|
|
rgb = GammaToLinearSpace(rgb);
|
|
#endif
|
|
|
|
return float4(rgb, src.a);
|
|
}
|
|
|
|
struct VaryingsArrows
|
|
{
|
|
float4 vertex : SV_POSITION;
|
|
float2 scoord : TEXCOORD;
|
|
float4 color : COLOR;
|
|
};
|
|
|
|
VaryingsArrows VertArrows(AttributesDefault v)
|
|
{
|
|
// Retrieve the motion vector.
|
|
float4 uv = float4(v.texcoord.xy, 0.0, 0.0);
|
|
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
uv.y = 1.0 - uv.y;
|
|
#endif
|
|
|
|
float2 mv = tex2Dlod(_CameraMotionVectorsTexture, uv).rg * _Amplitude;
|
|
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
mv.y *= -1.0;
|
|
#endif
|
|
|
|
// Arrow color
|
|
float4 color = VectorToColor(mv);
|
|
|
|
// Make a rotation matrix based on the motion vector.
|
|
float2x2 rot = float2x2(mv.y, mv.x, -mv.x, mv.y);
|
|
|
|
// Rotate and scale the body of the arrow.
|
|
float2 pos = mul(rot, v.vertex.zy) * _Scale.xy;
|
|
|
|
// Normalized variant of the motion vector and the rotation matrix.
|
|
float2 mv_n = normalize(mv);
|
|
float2x2 rot_n = float2x2(mv_n.y, mv_n.x, -mv_n.x, mv_n.y);
|
|
|
|
// Rotate and scale the head of the arrow.
|
|
float2 head = float2(v.vertex.x, -abs(v.vertex.x)) * 0.3;
|
|
head *= saturate(color.a);
|
|
pos += mul(rot_n, head) * _Scale.xy;
|
|
|
|
// Offset the arrow position.
|
|
pos += v.texcoord.xy * 2.0 - 1.0;
|
|
|
|
// Convert to the screen coordinates.
|
|
float2 scoord = (pos + 1.0) * 0.5 * _ScreenParams.xy;
|
|
|
|
// Snap to a pixel-perfect position.
|
|
scoord = round(scoord);
|
|
|
|
// Bring back to the normalized screen space.
|
|
pos = (scoord + 0.5) * (_ScreenParams.zw - 1.0) * 2.0 - 1.0;
|
|
|
|
// Color tweaks
|
|
color.rgb = GammaToLinearSpace(lerp(color.rgb, 1.0, 0.5));
|
|
color.a *= _Opacity;
|
|
|
|
// Output
|
|
VaryingsArrows o;
|
|
o.vertex = float4(pos, 0.0, 1.0);
|
|
o.scoord = scoord;
|
|
o.color = saturate(color);
|
|
return o;
|
|
}
|
|
|
|
float4 FragMovecsArrows(VaryingsArrows i) : SV_Target
|
|
{
|
|
// Pseudo anti-aliasing.
|
|
float aa = length(frac(i.scoord) - 0.5) / 0.707;
|
|
aa *= (aa * (aa * 0.305306011 + 0.682171111) + 0.012522878); // gamma
|
|
return float4(i.color.rgb, i.color.a * aa);
|
|
}
|
|
|
|
ENDCG
|
|
|
|
SubShader
|
|
{
|
|
Cull Off ZWrite Off ZTest Always
|
|
|
|
// (0) - Depth
|
|
Pass
|
|
{
|
|
CGPROGRAM
|
|
|
|
#pragma vertex VertDefault
|
|
#pragma fragment FragDepth
|
|
|
|
ENDCG
|
|
}
|
|
|
|
// (1) - Normals
|
|
Pass
|
|
{
|
|
CGPROGRAM
|
|
|
|
#pragma vertex VertDefault
|
|
#pragma fragment FragNormals
|
|
#pragma multi_compile __ SOURCE_GBUFFER
|
|
|
|
ENDCG
|
|
}
|
|
|
|
// (2) - Motion vectors - Opacity
|
|
Pass
|
|
{
|
|
CGPROGRAM
|
|
|
|
#pragma vertex VertDefault
|
|
#pragma fragment FragMovecsOpacity
|
|
|
|
ENDCG
|
|
}
|
|
|
|
// (3) - Motion vectors - Imaging
|
|
Pass
|
|
{
|
|
CGPROGRAM
|
|
|
|
#pragma vertex VertDefault
|
|
#pragma fragment FragMovecsImaging
|
|
#pragma multi_compile __ UNITY_COLORSPACE_GAMMA
|
|
|
|
ENDCG
|
|
}
|
|
|
|
// (4) - Motion vectors - Arrows
|
|
Pass
|
|
{
|
|
Blend SrcAlpha OneMinusSrcAlpha
|
|
|
|
CGPROGRAM
|
|
|
|
#pragma vertex VertArrows
|
|
#pragma fragment FragMovecsArrows
|
|
|
|
ENDCG
|
|
}
|
|
}
|
|
}
|