본문 바로가기
셰이더 (Shader)/유니티 쉐이더 스타트업 - 정종필

[Unity/Shader] 파트8-3 : Normal map

by Minkyu Lee 2023. 8. 7.

노말맵에 대해 알아본다.

UnpackNormal 부분이 특히 도움된다.

 

코드

Shader "Custom/part8-2"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Metallic ("Metalic", Range(0,1)) = 0
        _Smoothness("Smoothness", Range(0,1)) = 0.5
        _BumpMap("Normalmap", 2D) = "bump"{} // 유니티 내장 쉐이더에서 bump 명칭을 사용하고 있어 bumpmap으로 이름 짓는다.
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _BumpMap;
        float _Metallic;
        float _Smoothness;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

        UNITY_INSTANCING_BUFFER_START(Props)
            // put more per-instance properties here
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            /*
            fixed4 n = tex2D (_BumpMap, IN.uv_BumpMap);
            // 이렇게 하면 안된다. 노말맵은 DXTnm 파일 포맷 텍스쳐이다. 텍스쳐 압축에 의한 품질 저하 막기 위해 만든 AG 파일 포맷이다.
            // R과 G 퀄리티 최대한 보전하여 A와 G에 넣어 저장한다. B는 가지고 있지 않다.
            // R과 G를 X와 Y로 계산하고 Z는 삼각함수를 이용해 수학적으로 추출된다.
            // 이러한 공식이 적용된 함수도 있다. 아래 참고.
            */
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); // float3이다. x와 y에 숫자를 곱하여 강도를 조절할 수 있다.
            o.Albedo = c.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Smoothness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

댓글