You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
4.2 KiB
Plaintext
167 lines
4.2 KiB
Plaintext
1 month ago
|
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
|
||
|
|
||
|
|
||
|
Shader "Hidden/EdgeDetectGeometry" {
|
||
|
Properties {
|
||
|
_MainTex ("Base (RGB)", 2D) = "" {}
|
||
|
}
|
||
|
|
||
|
// Shader code pasted into all further CGPROGRAM blocks
|
||
|
CGINCLUDE
|
||
|
|
||
|
#include "UnityCG.cginc"
|
||
|
|
||
|
struct v2f {
|
||
|
float4 pos : POSITION;
|
||
|
float2 uv[5] : TEXCOORD0;
|
||
|
};
|
||
|
|
||
|
sampler2D _MainTex;
|
||
|
uniform half4 _MainTex_TexelSize;
|
||
|
sampler2D _CameraDepthNormalsTexture;
|
||
|
|
||
|
uniform half4 sensitivity;
|
||
|
uniform half4 _BgColor;
|
||
|
uniform half _BgFade;
|
||
|
|
||
|
inline half CheckSame (half2 centerNormal, float centerDepth, half4 sample)
|
||
|
{
|
||
|
// difference in normals
|
||
|
// do not bother decoding normals - there's no need here
|
||
|
half2 diff = abs(centerNormal - sample.xy) * sensitivity.y;
|
||
|
half isSameNormal = (diff.x + diff.y) * sensitivity.y < 0.1;
|
||
|
// difference in depth
|
||
|
float sampleDepth = DecodeFloatRG (sample.zw);
|
||
|
float zdiff = abs(centerDepth-sampleDepth);
|
||
|
// scale the required threshold by the distance
|
||
|
half isSameDepth = zdiff * sensitivity.x < 0.09 * centerDepth;
|
||
|
|
||
|
// return:
|
||
|
// 1 - if normals and depth are similar enough
|
||
|
// 0 - otherwise
|
||
|
|
||
|
return isSameNormal * isSameDepth;
|
||
|
}
|
||
|
|
||
|
v2f vertRobert( appdata_img v )
|
||
|
{
|
||
|
v2f o;
|
||
|
o.pos = UnityObjectToClipPos(v.vertex);
|
||
|
|
||
|
float2 uv = v.texcoord.xy;
|
||
|
o.uv[0] = uv;
|
||
|
|
||
|
// On D3D when AA is used, the main texture & scene depth texture
|
||
|
// will come out in different vertical orientations.
|
||
|
// So flip sampling of depth texture when that is the case (main texture
|
||
|
// texel size will have negative Y)
|
||
|
|
||
|
#if SHADER_API_D3D9
|
||
|
if (_MainTex_TexelSize.y < 0)
|
||
|
uv.y = 1-uv.y;
|
||
|
#endif
|
||
|
|
||
|
// calc coord for the X pattern
|
||
|
// maybe nicer TODO for the future: rotated triangles
|
||
|
|
||
|
o.uv[0] = uv;
|
||
|
o.uv[1] = uv + _MainTex_TexelSize.xy * half2(1,1);
|
||
|
o.uv[2] = uv + _MainTex_TexelSize.xy * half2(-1,-1);
|
||
|
o.uv[3] = uv + _MainTex_TexelSize.xy * half2(-1,1);
|
||
|
o.uv[4] = uv + _MainTex_TexelSize.xy * half2(1,-1);
|
||
|
|
||
|
return o;
|
||
|
}
|
||
|
|
||
|
v2f vertThin( appdata_img v )
|
||
|
{
|
||
|
v2f o;
|
||
|
o.pos = UnityObjectToClipPos (v.vertex);
|
||
|
|
||
|
float2 uv = v.texcoord.xy;
|
||
|
o.uv[0] = uv;
|
||
|
|
||
|
// On D3D when AA is used, the main texture & scene depth texture
|
||
|
// will come out in different vertical orientations.
|
||
|
// So flip sampling of depth texture when that is the case (main texture
|
||
|
// texel size will have negative Y)
|
||
|
|
||
|
#if SHADER_API_D3D9
|
||
|
if (_MainTex_TexelSize.y < 0)
|
||
|
uv.y = 1-uv.y;
|
||
|
#endif
|
||
|
|
||
|
o.uv[1] = uv;
|
||
|
o.uv[4] = uv;
|
||
|
|
||
|
// offsets for two additional samples
|
||
|
o.uv[2] = uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y);
|
||
|
o.uv[3] = uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y);
|
||
|
|
||
|
return o;
|
||
|
}
|
||
|
|
||
|
half4 fragRobert(v2f i) : COLOR {
|
||
|
|
||
|
//half4 sample0 = tex2D(_CameraDepthNormalsTexture, i.uv[0].xy);
|
||
|
half4 sample1 = tex2D(_CameraDepthNormalsTexture, i.uv[1].xy);
|
||
|
half4 sample2 = tex2D(_CameraDepthNormalsTexture, i.uv[2].xy);
|
||
|
half4 sample3 = tex2D(_CameraDepthNormalsTexture, i.uv[3].xy);
|
||
|
half4 sample4 = tex2D(_CameraDepthNormalsTexture, i.uv[4].xy);
|
||
|
|
||
|
half edge = 1.0;
|
||
|
|
||
|
edge *= CheckSame(sample1.xy, DecodeFloatRG(sample1.zw), sample2);
|
||
|
edge *= CheckSame(sample3.xy, DecodeFloatRG(sample3.zw), sample4);
|
||
|
|
||
|
return edge * lerp(tex2D(_MainTex, i.uv[0].xy), _BgColor, _BgFade);
|
||
|
}
|
||
|
|
||
|
half4 fragThin (v2f i) : COLOR
|
||
|
{
|
||
|
half4 original = tex2D(_MainTex, i.uv[0]);
|
||
|
|
||
|
half4 center = tex2D (_CameraDepthNormalsTexture, i.uv[1]);
|
||
|
half4 sample1 = tex2D (_CameraDepthNormalsTexture, i.uv[2]);
|
||
|
half4 sample2 = tex2D (_CameraDepthNormalsTexture, i.uv[3]);
|
||
|
|
||
|
// encoded normal
|
||
|
half2 centerNormal = center.xy;
|
||
|
// decoded depth
|
||
|
float centerDepth = DecodeFloatRG (center.zw);
|
||
|
|
||
|
half edge = 1.0;
|
||
|
|
||
|
edge *= CheckSame(centerNormal, centerDepth, sample1);
|
||
|
edge *= CheckSame(centerNormal, centerDepth, sample2);
|
||
|
|
||
|
return edge * lerp(original, _BgColor, _BgFade);
|
||
|
}
|
||
|
|
||
|
ENDCG
|
||
|
|
||
|
Subshader {
|
||
|
Pass {
|
||
|
ZTest Always Cull Off ZWrite Off
|
||
|
Fog { Mode off }
|
||
|
|
||
|
CGPROGRAM
|
||
|
#pragma vertex vertThin
|
||
|
#pragma fragment fragThin
|
||
|
ENDCG
|
||
|
}
|
||
|
Pass {
|
||
|
ZTest Always Cull Off ZWrite Off
|
||
|
Fog { Mode off }
|
||
|
|
||
|
CGPROGRAM
|
||
|
#pragma vertex vertRobert
|
||
|
#pragma fragment fragRobert
|
||
|
ENDCG
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
Fallback off
|
||
|
|
||
|
} // shader
|