// Copyright (c) <2015> // This file is subject to the MIT License as seen in the root of this folder structure (LICENSE.TXT) // AUTHOR: Lasse Jon Fuglsang Pedersen #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__