스토리지

[5.4] 금속의 울퉁불퉁함을 표현 - Shader Normal 본문

Unity/Shader

[5.4] 금속의 울퉁불퉁함을 표현 - Shader Normal

ljw4104 2021. 5. 4. 13:03

Normal 적용 전 / 적용 후

금속 재질들의 Asset들을 받아보면 이상하게 생긴 텍스쳐들을 볼 수 있다. 그것들의 공통점은 이름에 Normal이 들어간다는 것이다.

이 텍스쳐는 금속의 울퉁불퉁함을 표현하는 텍스쳐이고 데이터로 보면 된다.

 

 

이 데이터는 SurfaceOutputStandard 구조체의 멤버인 Normal에 대입함으로서 데이터를 삽입할 수 있다.

라이브러리에 UnpackNormal(fixed4) 함수로 구현이 가능하다.

 

*UnpackNormal 함수 구현 부

더보기
inline fixed3 UnpackNormal(fixed4 packednormal)
{
#if defined(UNITY_NO_DXT5nm)
    return packednormal.xyz * 2 - 1;
#else
    return UnpackNormalmapRGorAG(packednormal);
#endif
}

fixed3 UnpackNormalmapRGorAG(fixed4 packednormal)
{
    // This do the trick
   packednormal.x *= packednormal.w;

    fixed3 normal;
    normal.xy = packednormal.xy * 2 - 1;
    normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));
    return normal;
}

 

  1. 텍스쳐 구멍을 하나 뚫어놓는다. 기본값은 "bump" (기존,일반 텍스쳐는 "white")
  2. 변수 선언 및 UV 데이터 받아오기.
  3. Normal 텍스쳐를 SurfaceOutputStandard.Normal 변수에 넣음.
Shader "Custom/Test"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _BumpMap ("Albedo (RGB)", 2D) = "bump" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        CGPROGRAM
        #pragma surface surf Standard

        sampler2D _MainTex;
        sampler2D _BumpMap;
        half _Glossiness;
        half _Metallic;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            fixed4 n = tex2D (_BumpMap, IN.uv_BumpMap);     //기존 텍스쳐의 굴곡을 표현하는 데이터들이 담겨져있음. →풀어서 사용해야됨 (unpack_normal)

            o.Normal = UnpackNormal(n);
            o.Albedo = c.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
Comments