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