边缘检测效果动画Shader实现

Shader "Unlit/AnimateEdgeShader"

{

Properties

{

_MainTex ("Texture", 2D) = "white" {}

_EdgeOnly ("Edge Only",Range(0,1)) = 1

_EdgeColor ("Edge Color",Color) = (1,0,0,1)

_BackgroundColor ("Background Color",Color) = (1,1,1,1)

_AnimateTex ("Texture", 2D) = "white" {}

_ScrollX ("Speed",Float) = 0.5

}

SubShader

{

Tags { "RenderType"="Opaque" }

LOD 100

Blend SrcAlpha OneMinusSrcAlpha

Pass

{

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "UnityCG.cginc"

struct appdata

{

float4 vertex : POSITION;

float2 uv : TEXCOORD0;

};

struct v2f

{

float4 vertex : SV_POSITION;

float2 uv : TEXCOORD0;

};

sampler2D _MainTex;

float4 _MainTex_ST;

v2f vert (appdata v)

{

v2f o;

o.vertex = UnityObjectToClipPos(v.vertex);

o.uv = TRANSFORM_TEX(v.uv, _MainTex);

return o;

}

fixed4 frag (v2f i) : SV_Target

{

return tex2D(_MainTex, i.uv);

}

ENDCG

}

Pass

{

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "UnityCG.cginc"

struct appdata

{

float4 vertex : POSITION;

float2 uv : TEXCOORD0;

};

struct v2f

{

float4 vertex : SV_POSITION;

float2 uv[9] : TEXCOORD0;

};

sampler2D _AnimateTex;

float4 _AnimateTex_ST;

float _ScrollX;

sampler2D _MainTex;

half4 _MainTex_TexelSize;

float4 _MainTex_ST;

fixed _EdgeOnly;

fixed4 _EdgeColor;

fixed4 _BackgroundColor;

fixed luminance(fixed4 color)

{

return 0.2125 * color.r + 0.7154 * color.g + 0.0721 * color.b;

}

half Sobel(v2f i)

{

const half Gx[9] = {

-1,-2,-1,

0,0,0,

1,2,1

};

const half Gy[9] = {

-1,0,1,

-2,0,2,

-1,0,1

};

half texColor;

half edgeX = 0;

half edgeY = 0;

for (int it = 0;it < 9;it++)

{

texColor = luminance(tex2D(_MainTex,i.uv[it]));

edgeX += texColor * Gx[it];

edgeY += texColor * Gy[it];

}

half edge = 1 - abs(edgeX) - abs(edgeY);

return edge;

}

v2f vert (appdata v)

{

v2f o;

o.vertex = UnityObjectToClipPos(v.vertex);

o.uv[0] = v.uv + _MainTex_TexelSize.xy * half2(-1,-1);

o.uv[1] = v.uv + _MainTex_TexelSize.xy * half2(0,-1);

o.uv[2] = v.uv + _MainTex_TexelSize.xy * half2(1,-1);

o.uv[3] = v.uv + _MainTex_TexelSize.xy * half2(-1,0);

o.uv[4] = v.uv + _MainTex_TexelSize.xy * half2(0,0);

o.uv[5] = v.uv + _MainTex_TexelSize.xy * half2(1,0);

o.uv[6] = v.uv + _MainTex_TexelSize.xy * half2(-1,1);

o.uv[7] = v.uv + _MainTex_TexelSize.xy * half2(0,1);

o.uv[8] = v.uv + _MainTex_TexelSize.xy * half2(1,1);

o.uv[4] = TRANSFORM_TEX(v.uv, _AnimateTex) + frac(float2(0.0,-_ScrollX) * _Time.y);

return o;

}

fixed4 frag (v2f i) : SV_Target

{

half edge = Sobel(i);

fixed4 withEdgeColor = lerp(_EdgeColor,tex2D(_MainTex, i.uv[4]),edge);

fixed4 onlyEdgeColor = lerp(_EdgeColor,_BackgroundColor,edge);

fixed4 finalColor = lerp(withEdgeColor,onlyEdgeColor,_EdgeOnly);

fixed4 col = tex2D(_AnimateTex, i.uv[4]);

return fixed4(finalColor.rgb,(finalColor.a * (1.0 - col.r)));

}

ENDCG

}

}

}

完后创建材质球,选择该shader,第一个texture则是要检测边缘的图片,第二张图片就是我们边框描绘的图片。另外得把该材质球放到BackGround Plane上面

你可能感兴趣的:(边缘检测效果动画Shader实现)