Version: 2021.3
언어: 한국어
라이트맵: 기술 정보
라이트맵 UV

라이트매핑 및 셰이더

이 페이지에는 Unity의 라이트매퍼와 호환되는 셰이더를 만드는 방법에 대한 정보가 담겨 있습니다.

메타 패스

메타 패스는 전역 조명 시스템에 알베도 및 이미션 값을 제공하는 셰이더 패스입니다. 이 값은 실시간 렌더링에 사용되는 값과 별개입니다. 즉, 메타 패스를 사용하여 런타임 시 형상에 영향을 주지 않고 조명 베이킹 시스템의 시점에서 게임 오브젝트가 어떻게 보이는지 제어할 수 있습니다.

유용한 예를 들어 보면 절벽의 녹색 이끼가 라이트맵에서 과장된 녹색 간접광을 생성하기 원했지만 실시간 셰이더 패스에서 터레인을 다시 채색하고 싶지 않은 경우입니다.

Unity의 모든 빌트인 머티리얼에는 메타 패스가 있고, 스탠다드 셰이더에는 메타 패스가 포함되어 있습니다. 이를 사용하는 경우에는 메타 패스를 활성화하기 위한 별도의 작업이 필요하지 않습니다. 커스텀 셰이더를 사용하는 경우 고유한 메타 패스를 추가할 수 있습니다.

메타 패스가 포함된 셰이더 예시

아래의 셰이더를 사용하면 런타임 시 머티리얼의 형상에 영향을 주지 않고 조명 베이크 시스템에서만 사용되는 알베도 컬러와 알베도 텍스처를 지정할 수 있습니다. 이 예시에서 이미션은 UV에서 가져오지만, 모든 값을 사용하여 이를 제어할 수 있습니다.

Shader "Custom/metaPassShader"{

    Properties {
        _Color ("Color", Color)=(1,1,1,1)
        _MainTex ("Albedo (RGB)",2D)="white"{}
        _Glossiness ("Smoothness", Range(0,1))=0.5
        _Metallic ("Metallic", Range(0,1))=0.0

        _GIAlbedoColor ("Color Albedo (GI)", Color)=(1,1,1,1)
        _GIAlbedoTex ("Albedo (GI)",2D)="white"{}
    }

    SubShader {
    // ------------------------------------------------------------------
    // Extracts information for lightmapping, GI (emission, albedo, ...)
    // This pass is not used during regular rendering.
        Pass
        {
            Name "META"
            Tags {"LightMode"="Meta"}
            Cull Off
            CGPROGRAM

            #include"UnityStandardMeta.cginc"

            sampler2D _GIAlbedoTex;
            fixed4 _GIAlbedoColor;
            float4 frag_meta2 (v2f_meta i): SV_Target
            {
                // We're interested in diffuse & specular colors
                // and surface roughness to produce final albedo.

                FragmentCommonData data = UNITY_SETUP_BRDF_INPUT (i.uv);
                UnityMetaInput o;
                UNITY_INITIALIZE_OUTPUT(UnityMetaInput, o);
                fixed4 c = tex2D (_GIAlbedoTex, i.uv);
                o.Albedo = fixed3(c.rgb * _GIAlbedoColor.rgb);
                o.Emission = Emission(i.uv.xy);
                return UnityMetaFragment(o);
            }

            #pragma vertex vert_meta
            #pragma fragment frag_meta2
            #pragma shader_feature _EMISSION
            #pragma shader_feature _METALLICGLOSSMAP
            #pragma shader_feature ___ _DETAIL_MULX2
            ENDCG
        }

        Tags {"RenderType"="Opaque"}
        LOD 200

        CGPROGRAM
        // Physically-based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows nometa
        // Use Shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        void surf (Input IN,inout SurfaceOutputStandard o){
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex)* _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }

    FallBack "Diffuse"
}

메타 패스 기술 정보

인라이튼 실시간 전역 조명과 라이트매핑은 Unity의 메타 패스를 사용하여 표면에서 알베도 값을 추출하고 각 바운스에서 표면 알베도를 사용하여 직접 디퓨즈 전송을 처리합니다.

검은색(또는 거의 검은색에 가까운) 알베도를 가진 메탈릭 표면은 매우 작은 산란광을 반사합니다. 라이트매퍼는 산란광 전송만 처리하기 때문에 이런 유형의 표면에서 반사광이 거의 보이지 않을 수 있습니다. Unity의 빌트인 메타 패스는 물리적으로 정확한 알베도 대신에 강화된 버전의 Metal 색상 컬러를 제공하여 이를 설명합니다. 이것은 메탈릭 머티리얼에서도 약간의 바운스를 얻을 수 있음을 의미합니다. 다른 동작을 원하면 커스텀 메타 패스를 만들 수 있습니다.

빌트인 메타 패스는 분광 스페큘러 반사율을 처리하지 않습니다.

참고: 인라이튼 실시간 전역 조명을 사용하는 경우 플레이어의 메타 패스는 DynamicGI.SetEmissive만큼 빠르지 않지만 단일 컬러로 제한되지 않기 때문에 더 유연합니다.

커스텀 RGB 투명도

기본적으로 Unity의 셰이더는 단색 투명도를 사용합니다. 이는 Unity가 머티리얼 컬러 또는 알베도 텍스처의 알파 채널을 사용하여 머티리얼을 통한 빛 투과를 평가한다는 것을 의미합니다.

라이트매핑 중에 커스텀 RGB 투명도를 대신 사용할 수 있습니다. 이는 Unity가 주어진 텍스처의 값을 사용하여 머티리얼을 통한 빛 투과를 평가한다는 것을 의미합니다. 이것은 머티리얼 컬러나 알베도 텍스처와 독립적인 컬러 기반 투명도를 원할 때 유용합니다. 예를 들어 스테인드 글라스 창을 통해 비치는 빛의 동작을 시뮬레이션하는 조명을 베이킹하려는 경우 유용합니다.

라이트매핑 중에 커스텀 RGB 투명도를 사용하려면 ShaderLab 코드에 다음 줄을 추가합니다.

_TransparencyLM ("Transmissive Texture", 2D) = "white" {}

이 줄을 추가하면 머티리얼 인스펙터에 “Transmissive Texture”라는 이름으로 나타나는 머티리얼 프로퍼티가 생성됩니다. 이 필드에 원하는 텍스처를 할당합니다.

라이트맵: 기술 정보
라이트맵 UV