|
|
- 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
- }
- }
- }
|