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

Unity Shader) 컬러를 오버레이 해서 스포트라이트 효과 내기

by 테샤르 2024. 11. 28.

컬러를 오버레이 해서 스포트라이트 효과 내기

 

 

반응형
반응형

 

< 코인 아이템 적용 >

코인 아이콘을 기준으로 해당 효과를 적용하면 다음과 같다.

 

< Material 속성 >


< Shader Code >

Shader"Custom/InnerCardGlow_Offset"
{
    Properties
    {
        _MainTex ("Main Texture (With Transparent Background)", 2D) = "white" {}
        _GlowRadius ("Glow Radius", Float) = 0.3
        _BorderGradientSpeed ("Border Animation Speed", Float) = 1
        _BlurAmount ("Glow Blur Amount", Float) = 0.75
        _GlowOffset ("Glow Center Offset (UV)", Vector) = (0.5, 0.5, 0, 0) // 중심 좌표 기본값
    }

    SubShader
    {
        Tags { "Queue"="Transparent" "RenderType"="Transparent" }
Blend SrcAlpha
OneMinusSrcAlpha
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
#include "UnityCG.cginc"

            // Properties
sampler2D _MainTex;
float _GlowRadius;
float _BorderGradientSpeed;
float _BlurAmount;
float4 _GlowOffset; // Glow 중심 좌표 오프셋 (UV 좌표)

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;
}

fixed4 conicGradient(float2 uv, float angle)
{
                // UV를 Polar 좌표로 변환
    float2 centeredUV = uv - 0.5;
    float theta = atan2(centeredUV.y, centeredUV.x) + angle;
    float t = frac(theta / (2 * UNITY_PI)); // [0, 1] 범위로 정규화

                // 12개 색상 팔레트 정의
    fixed4 colors[12] =
    {
        fixed4(0.4, 0.6, 0, 1), // #669900
                    fixed4(0.6, 0.8, 0.2, 1), // #99cc33
                    fixed4(0.8, 0.9, 0.4, 1), // #ccee66
                    fixed4(0, 0.4, 0.6, 1), // #006699
                    fixed4(0.2, 0.6, 0.8, 1), // #3399cc
                    fixed4(0.6, 0, 0.4, 1), // #990066
                    fixed4(0.8, 0.2, 0.6, 1), // #cc3399
                    fixed4(1, 0.4, 0, 1), // #ff6600
                    fixed4(1, 0.6, 0, 1), // #ff9900
                    fixed4(1, 0.8, 0, 1), // #ffcc00
                    fixed4(0.4, 0.6, 0, 1), // 반복 시작
                    fixed4(0.6, 0.8, 0.2, 1) // 첫 색상과 일치 (부드러운 전환용)
    };

                // 색상 인덱스 계산 및 보간
    float scaledT = t * 11;
    int index1 = int(floor(scaledT));
    int index2 = (index1 + 1) % 12;
    float blendFactor = frac(scaledT);

    return lerp(colors[index1], colors[index2], blendFactor);
}

fixed4 frag(v2f i) : SV_Target
{
                // 텍스처 샘플링
    fixed4 texColor = tex2D(_MainTex, i.uv);

                // Glow 중심 좌표를 기준으로 거리 계산
    float2 glowCenter = _GlowOffset.xy; // UV 공간에서 중심 오프셋 적용
    float2 centeredUV = i.uv - glowCenter;
    float dist = length(centeredUV);

                // 애니메이션 그라디언트 계산
    float time = _Time.y * _BorderGradientSpeed;
    fixed4 gradientColor = conicGradient(i.uv, time);

                // Inner Glow 생성
    float innerMask = smoothstep(_GlowRadius, _GlowRadius - _BlurAmount, dist);
    fixed4 innerGlowColor = gradientColor * innerMask;

                // 텍스처와 Glow 혼합
    fixed4 finalColor = texColor + innerGlowColor;

                // 텍스처의 알파 값 유지
    finalColor.a = texColor.a;

    return finalColor;
}
            ENDCG
        }
    }
FallBack"Transparent"
}

 

★★★☆☆

 

반응형

댓글