79 lines
3.1 KiB
Plaintext
79 lines
3.1 KiB
Plaintext
|
/*========================================================================
|
||
|
Copyright (c) 2017 PTC Inc. All Rights Reserved.
|
||
|
|
||
|
Vuforia is a trademark of PTC Inc., registered in the United States and other
|
||
|
countries.
|
||
|
=========================================================================*/
|
||
|
Shader "Custom/DepthContour" {
|
||
|
Properties{
|
||
|
_ContourColor("Contour Color", Color) = (1,1,1,1)
|
||
|
_SurfaceColor("Surface Color", Color) = (0.5,0.5,0.5,1)
|
||
|
_DepthThreshold("Depth Threshold", Float) = 0.002
|
||
|
}
|
||
|
|
||
|
SubShader {
|
||
|
Tags { "Queue" = "Geometry" "RenderType" = "Transparent" }
|
||
|
|
||
|
Pass {
|
||
|
Cull Back
|
||
|
Blend SrcAlpha OneMinusSrcAlpha
|
||
|
|
||
|
CGPROGRAM
|
||
|
#pragma vertex vert
|
||
|
#pragma fragment frag
|
||
|
#include "UnityCG.cginc"
|
||
|
|
||
|
uniform sampler2D _CameraDepthTexture;
|
||
|
uniform float4 _ContourColor;
|
||
|
uniform float4 _SurfaceColor;
|
||
|
uniform float _DepthThreshold;
|
||
|
|
||
|
struct v2f {
|
||
|
float4 pos : SV_POSITION;
|
||
|
float4 screenPos : TEXCOORD0;
|
||
|
float depth : TEXCOORD1;
|
||
|
};
|
||
|
|
||
|
v2f vert(appdata_base v)
|
||
|
{
|
||
|
v2f o;
|
||
|
o.pos = UnityObjectToClipPos(v.vertex);
|
||
|
o.screenPos = ComputeScreenPos(o.pos);
|
||
|
|
||
|
COMPUTE_EYEDEPTH(o.depth);
|
||
|
o.depth = (o.depth - _ProjectionParams.y) / (_ProjectionParams.z - _ProjectionParams.y);
|
||
|
return o;
|
||
|
}
|
||
|
|
||
|
half4 frag(v2f i) : COLOR
|
||
|
{
|
||
|
float2 uv = i.screenPos.xy / i.screenPos.w;
|
||
|
float du = 1.0 / _ScreenParams.x;
|
||
|
float dv = 1.0 / _ScreenParams.y;
|
||
|
float2 uv_X1 = uv + float2(du, 0.0);
|
||
|
float2 uv_Y1 = uv + float2(0.0, dv);
|
||
|
float2 uv_X2 = uv + float2(-du, 0.0);
|
||
|
float2 uv_Y2 = uv + float2(0.0, -dv);
|
||
|
|
||
|
float depth0 = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture, uv)));
|
||
|
float depthX1 = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture, uv_X1)));
|
||
|
float depthY1 = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture, uv_Y1)));
|
||
|
float depthX2 = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture, uv_X2)));
|
||
|
float depthY2 = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture, uv_Y2)));
|
||
|
|
||
|
float farDist = _ProjectionParams.z;
|
||
|
float refDepthStep = _DepthThreshold / farDist;
|
||
|
float depthStepX = max(abs(depth0 - depthX1), abs(depth0 - depthX2));
|
||
|
float depthStepY = max(abs(depth0 - depthY1), abs(depth0 - depthY2));
|
||
|
float maxDepthStep = length(float2(depthStepX, depthStepY));
|
||
|
half contour = (maxDepthStep > refDepthStep) ? 1.0 : 0.0;
|
||
|
return _SurfaceColor * (1.0 - contour) + _ContourColor * contour;
|
||
|
}
|
||
|
|
||
|
ENDCG
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Fallback "Diffuse"
|
||
|
}
|