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

Unity Shader) 2D이미지를 3D 처럼 표현하기

by 테샤르 2024. 11. 14.

2D이미지를 3D 처럼 표현하기

 

2D 이미지를 여러가지 레이어를 나눠서 움직임을 주는 형태로 작업을 하면 좀 꿀렁거리긴하지만 3D 처럼 효과를 낼수 있다. 해당 방법을 통해서 조금더 입체감 있는 형태의 표현을 진행했다.

 

반응형

 

< Material 속성 >

 

< Shader Code >

Shader"Custom/MetallicShinyEffect"
{
    Properties
    {
        _MainTex ("Base (RGB)", 2D) = "white" { }
        _ShinyColor ("Shiny Color", Color) = (1, 1, 0, 1)
        _Metallic ("Metallic", Range(0, 1)) = 0.5
        _Smoothness ("Smoothness", Range(0, 1)) = 0.5
        _Location ("Location", Vector) = (0.5, 0.5, 0, 0)  // Location을 좌표값으로 설정 (x, y)
        _Width ("Width", Range(0, 1)) = 0.25
        _Softness ("Softness", Range(0.01, 1)) = 0.5
        _Brightness ("Brightness", Range(0, 1)) = 1.0
        _Highlight ("Highlight", Range(0, 1)) = 0.5
    }
    SubShader
    {
        Tags { "Queue"="Overlay" "RenderType"="Opaque" }
        
        Pass
        {
Blend SrcAlpha
OneMinusSrcAlpha

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
#include "UnityCG.cginc"

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

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

float _Metallic;
float _Smoothness;
float _Width;
float _Softness;
float _Brightness;
float _Highlight;
float4 _ShinyColor;
sampler2D _MainTex;
float2 _Location; // (x, y) 좌표 값

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

half4 frag(v2f i) : SV_Target
{
    half4 texColor = tex2D(_MainTex, i.uv);

                // Location 값을 사용하여 화면 좌표를 기준으로 빛나는 부분을 계산
    float dist = distance(i.uv, _Location); // UV 좌표에서 Location 좌표까지의 거리 계산
    half3 shiny = _ShinyColor.rgb * (1 - smoothstep(0.0, _Width, dist)); // 거리 기반으로 효과 적용

    texColor.rgb = lerp(texColor.rgb, shiny, _Brightness);

                // Smoothness에 따라 Alpha 처리
    texColor.a *= _Smoothness; // 투명도 적용

    texColor.rgb *= texColor.a; // 최종 색상에 alpha 적용

    return texColor;
}
            ENDCG
        }
    }
Fallback"Unlit/Transparent"
}

 

 

★★★☆

 

반응형

댓글