|
|
- // Copyright (c) <2015> <Playdead>
- // This file is subject to the MIT License as seen in the root of this folder structure (LICENSE.TXT)
- // AUTHOR: Lasse Jon Fuglsang Pedersen <lasse@playdead.com>
-
- #ifndef __DEPTH_CGINC__
- #define __DEPTH_CGINC__
-
- #include "UnityCG.cginc"
-
- uniform sampler2D_float _CameraDepthTexture;
- uniform float4 _CameraDepthTexture_TexelSize;
-
- #if UNITY_REVERSED_Z
- #define ZCMP_GT(a, b) (a < b)
- #else
- #define ZCMP_GT(a, b) (a > b)
- #endif
-
- float depth_resolve_linear(float z)
- {
- #if CAMERA_ORTHOGRAPHIC
- #if UNITY_REVERSED_Z
- return (1.0 - z) * (_ProjectionParams.z - _ProjectionParams.y) + _ProjectionParams.y;
- #else
- return z * (_ProjectionParams.z - _ProjectionParams.y) + _ProjectionParams.y;
- #endif
- #else
- return LinearEyeDepth(z);
- #endif
- }
-
- float depth_sample_linear(float2 uv)
- {
- return depth_resolve_linear(tex2D(_CameraDepthTexture, uv).x);
- }
-
- float3 find_closest_fragment_3x3(float2 uv)
- {
- float2 dd = abs(_CameraDepthTexture_TexelSize.xy);
- float2 du = float2(dd.x, 0.0);
- float2 dv = float2(0.0, dd.y);
-
- float3 dtl = float3(-1, -1, tex2D(_CameraDepthTexture, uv - dv - du).x);
- float3 dtc = float3( 0, -1, tex2D(_CameraDepthTexture, uv - dv).x);
- float3 dtr = float3( 1, -1, tex2D(_CameraDepthTexture, uv - dv + du).x);
-
- float3 dml = float3(-1, 0, tex2D(_CameraDepthTexture, uv - du).x);
- float3 dmc = float3( 0, 0, tex2D(_CameraDepthTexture, uv).x);
- float3 dmr = float3( 1, 0, tex2D(_CameraDepthTexture, uv + du).x);
-
- float3 dbl = float3(-1, 1, tex2D(_CameraDepthTexture, uv + dv - du).x);
- float3 dbc = float3( 0, 1, tex2D(_CameraDepthTexture, uv + dv).x);
- float3 dbr = float3( 1, 1, tex2D(_CameraDepthTexture, uv + dv + du).x);
-
- float3 dmin = dtl;
- if (ZCMP_GT(dmin.z, dtc.z)) dmin = dtc;
- if (ZCMP_GT(dmin.z, dtr.z)) dmin = dtr;
-
- if (ZCMP_GT(dmin.z, dml.z)) dmin = dml;
- if (ZCMP_GT(dmin.z, dmc.z)) dmin = dmc;
- if (ZCMP_GT(dmin.z, dmr.z)) dmin = dmr;
-
- if (ZCMP_GT(dmin.z, dbl.z)) dmin = dbl;
- if (ZCMP_GT(dmin.z, dbc.z)) dmin = dbc;
- if (ZCMP_GT(dmin.z, dbr.z)) dmin = dbr;
-
- return float3(uv + dd.xy * dmin.xy, dmin.z);
- }
-
- /* UNUSED: tested slower than branching
- float2 find_closest_fragment_3x3_packed(in float2 uv)
- {
- float2 dd = abs(_CameraDepthTexture_TexelSize.xy);
- float2 du = float2(dd.x, 0.0);
- float2 dv = float2(0.0, dd.y);
-
- const float s = 100000.0;
- float dtl = trunc(s * tex2D(_CameraDepthTexture, uv - dv - du).x) + 0.1010;// -+-+
- float dtc = trunc(s * tex2D(_CameraDepthTexture, uv - dv).x) + 0.0010;
- float dtr = trunc(s * tex2D(_CameraDepthTexture, uv - dv + du).x) + 0.0110;
- float dml = trunc(s * tex2D(_CameraDepthTexture, uv - du).x) + 0.1000;
- float dmc = trunc(s * tex2D(_CameraDepthTexture, uv).x) + 0.0000;
- float dmr = trunc(s * tex2D(_CameraDepthTexture, uv + du).x) + 0.0100;
- float dbl = trunc(s * tex2D(_CameraDepthTexture, uv + dv - du).x) + 0.1001;
- float dbc = trunc(s * tex2D(_CameraDepthTexture, uv + dv).x) + 0.0001;
- float dbr = trunc(s * tex2D(_CameraDepthTexture, uv + dv + du).x) + 0.0101;
- float enc = frac(min(dtl, min(dtc, min(dtr, min(dml, min(dmc, min(dmr, min(dbl, min(dbc, dbr)))))))));
-
- float ru = 0.0;
- float rv = 0.0;
-
- enc *= 10.0;
- ru -= trunc(enc);
- enc = frac(enc);
-
- enc *= 10.0;
- ru += trunc(enc);
- enc = frac(enc);
-
- enc *= 10.0;
- rv -= trunc(enc);
- enc = frac(enc);
-
- enc *= 10.0;
- rv += trunc(enc);
- enc = frac(enc);
-
- return uv + dd * float2(ru, rv);
- }*/
-
- float3 find_closest_fragment_5tap(float2 uv)
- {
- float2 dd = abs(_CameraDepthTexture_TexelSize.xy);
- float2 du = float2(dd.x, 0.0);
- float2 dv = float2(0.0, dd.y);
-
- float2 tl = -dv - du;
- float2 tr = -dv + du;
- float2 bl = dv - du;
- float2 br = dv + du;
-
- float dtl = tex2D(_CameraDepthTexture, uv + tl).x;
- float dtr = tex2D(_CameraDepthTexture, uv + tr).x;
- float dmc = tex2D(_CameraDepthTexture, uv).x;
- float dbl = tex2D(_CameraDepthTexture, uv + bl).x;
- float dbr = tex2D(_CameraDepthTexture, uv + br).x;
-
- float dmin = dmc;
- float2 dif = 0.0;
-
- if (ZCMP_GT(dmin, dtl)) { dmin = dtl; dif = tl; }
- if (ZCMP_GT(dmin, dtr)) { dmin = dtr; dif = tr; }
- if (ZCMP_GT(dmin, dbl)) { dmin = dbl; dif = bl; }
- if (ZCMP_GT(dmin, dbr)) { dmin = dbr; dif = br; }
-
- return float3(uv + dif, dmin);
- }
-
- #endif//__DEPTH_CGINC__
|