Version: 2021.2
言語: 日本語
ライトマップ - 技術的な情報
ライトマップ UV

ライトマッピングとシェーダーメタパス

A GameObject must use a Material that has a Meta Pass in its Shader in order to receive or contribute to lighting calculated by the Progressive Lightmapper or Enlighten Baked or Realtime Global Illumination.

メタパス (Meta Pass) とは、グローバルイルミネーションシステムにアルベド値とエミッション (発光) 値を提供するシェーダーパスのことです。これらの値はリアルタイムレンダリングで使用される値とは別のものです。つまり、メタパスを使用して、ランタイムでの見た目に影響を与えることなく、ライティングベイクシステムの視点からのゲームオブジェクトの見え方を制御することができます。

例えば、“崖の上にある緑の苔に、誇張した緑の間接光をライトマップ内で生成させたいが、シェーダーのリアルタイムパスで Terrain (地形) を再カラーリングしたくない場合” などに役立ちます。

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

技術情報

Enlighten リアルタイムグローバルイルミネーションとライトマッピングは、Unity のメタパスを使用してサーフェスからアルベド値を抽出し、各バウンスのサーフェスアルベドを使用して拡散輸送を自ら処理します。

黒色 (あるいはほぼ黒色) のアルベドを持つ金属サーフェスは、光をほとんど拡散反射させません。ライトマッパーは拡散光の輸送のみを扱うため、これは、このタイプのサーフェスから跳ね返される光は少ししか見えないことを意味します。Unity のビルトインのメタパスはこの点を考慮し、物理的に正しいアルベドではなく、ブーストされたバージョンの金属色相カラーを提供します。つまり、メタリックマテリアルからもある程度の反射が得られます。異なる動作が必要な場合は、カスタムのメタパスを作成することも可能です。

ビルトインのメタパスは、スペクトルの鏡面反射を扱えません。

ノート: Enlighten を使用している場合は、プレイヤー内のメタパスは DynamicGI.SetEmissive ほど高速ではありませんが、単一の色に制約されないため、より柔軟です。

ライトマップ - 技術的な情報
ライトマップ UV