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

Unity Shader) 금속 재질 처럼 표현하는 효과

by 테샤르 2024. 11. 13.

금속 재질 처럼 표현하는 효과

 

Unity 에서 Texture를 금속 재질처럼 빛에 반사되는 느낌을 주는 쉐이더 코드를 테스트 해보았다.

금속이나 유리 같은 표면의 특유의 반짝임을 표현하기 위해서 사용한다.

메탈릭(Metallic) 및 러프니스(Roughness)등의 속성값을 조절하여 금속 특유의 표현하기도 한다.

 

반응형

 

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

 

 

★★★☆☆

 

반응형

댓글