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