본문 바로가기
개발/Unity) Shader

UnityShader) 외곽선만 표시하는 쉐이더

by 테샤르 2024. 12. 5.

외곽선만 표시하는 쉐이더

 

이미지의 외곽선을 판단해서 해당 외곽선을 부각시키기 위한 쉐이더이다.

 

 

반응형
반응형

 

< Material 속성 >


< Shader Code >

Shader"Custom/EdgeShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _EdgeColor ("Edge Color", Color) = (1, 1, 1, 1) // 사용자 정의 Edge 색상
        _Threshold ("Edge Threshold", Range(0, 1)) = 0.1
        _EdgeSize ("Edge Size", Range(1, 10)) = 1 // Edge 크기 조절
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" }

        Pass
        {
ZTest Always

Cull Off

ZWrite Off

Blend SrcAlpha
OneMinusSrcAlpha

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

#include "UnityCG.cginc"

sampler2D _MainTex;
float4 _MainTex_TexelSize;
float4 _EdgeColor; // 사용자 정의 Edge 색상 (RGBA)
float _Threshold;
float _EdgeSize; // Edge 크기 조절 값

struct appdata_t
{
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;
};

struct v2f
{
    float2 uv : TEXCOORD0;
    float4 vertex : SV_POSITION;
};

v2f vert(appdata_t v)
{
    v2f o;
    o.vertex = UnityObjectToClipPos(v.vertex);
    o.uv = v.uv;
    return o;
}

float4 frag(v2f i) : SV_Target
{
                // Sample the texture
    float4 texColor = tex2D(_MainTex, i.uv);

                // Preserve Alpha from the original texture
    if (texColor.a == 0)
    {
        return float4(0, 0, 0, 0); // 투명 영역 유지
    }

    float2 texelSize = _MainTex_TexelSize.xy * _EdgeSize; // Edge Size 조절 적용

                // Sample neighboring pixels
    float3 col = texColor.rgb;
    float3 colRight = tex2D(_MainTex, i.uv + float2(texelSize.x, 0)).rgb;
    float3 colLeft = tex2D(_MainTex, i.uv - float2(texelSize.x, 0)).rgb;
    float3 colUp = tex2D(_MainTex, i.uv + float2(0, texelSize.y)).rgb;
    float3 colDown = tex2D(_MainTex, i.uv - float2(0, texelSize.y)).rgb;

                // Compute differences
    float diffX = length(col - colRight) + length(col - colLeft);
    float diffY = length(col - colUp) + length(col - colDown);

                // Combine differences to detect edges
    float edge = step(_Threshold, diffX) + step(_Threshold, diffY);

                // If it's an edge, apply the Edge Color, otherwise make it transparent
    if (edge > 0)
    {
        return float4(_EdgeColor.rgb, _EdgeColor.a); // Edge 색상과 Alpha
    }
    else
    {
        return float4(0, 0, 0, 0); // 투명
    }
}
            ENDCG
        }
    }
}

 

★★☆☆☆

 

반응형

댓글