ライトプローブとメッシュレンダラー
シーンビューにおける GI の可視化

Light Probe Proxy Volumes (LPPV) コンポーネント

Light Probe Proxy Volume (LPPV) コンポーネントを使うと、ベイクしたライトマップを使う事が出来ない、大きくて動的なゲームオブジェクト(例えば、大きなパーティクルやスキンメッシュ等)に、ライティングインフォメーションを追加する事ができます。

デフォルトでは、プローブに照らされるレンダラーは、シーンをとりまくライトプローブから補間された単一の プローブ からの光を受けとります。このため、ゲームオブジェクトは表面全体に一定のアンビエントライティングを受けます。このライティングは球面調和関数を使うので、回転的なグラデーションを持ちますが、空間的グラデーションはありません。これは大きなゲームオブジェクトやパーティクルで、よりはっきりとわかります。ゲームオブジェクト全体のライティングはアンカーポイントでのライティングと一致しており、ゲームオブジェクトがライティングのグラデーションにまたがると、ゲームオブジェクトが部分的に正しく表示されない場合があります。

Light Probe Proxy Volume コンポーネントは、バウンディングボリュームの内側にあるライトプローブを補間した 3D グリッドを生成します。コンポーネントの UI 上からグリッドの解像度を指定する事ができます。ライトプローブを補間した球面調和関数 (SH) の係数が 3D テクスチャに読み込まれます。その後、レンダリングする際、拡散 (diffuse)アンビエントライティングへの影響を計算するために SH の係数を内包した 3D テクスチャがサンプリングされます。これによりプローブに照らされたゲームオブジェクトに空間的グラデーションが追加されます。

Standard Shader はこの機能をサポートしています。カスタムシェーダーに追加する場合は、ShadeSHPerPixel 関数を使ってください。この関数の実装方法は、このページの下部にある Particle System sample Shader のサンプルコードを参照してください。

いつ LPPV コンポーネントを使うか

Unity の Renderer コンポーネントのほとんどにライトプローブが内包されています。ライトプローブにはオプションが 3 つ有ります。

  • Off: Renderer は、補間したライトプローブを使用しません。

  • Blend Probes (デフォルト): Renderer は 1 つの補間したライトプローブを使います。

  • Use Proxy Volume: Renderer は補間したライトプローブの 3D グリッドを使います。

Light Probes プロパティを Use Proxy Volume に設定するとき、ゲームオブジェクトに Light Probe Proxy Volume (LPPV) コンポーネントがアタッチされていなければなりません。そのゲームオブジェクトに LPPV コンポーネントを追加したり、 Proxy Volume Override プロパティを使って他のゲームオブジェクトの LPPV コンポーネントを使う (借りる) ことができます。現在のゲームオブジェクト内、または Proxy Volume Override GameObject (Proxy Volume をオーバーライドするゲームオブジェクト) に LPPV コンポーネントが見つからない場合は、Renderer ウィンドウの下部に警告メッセージが表示されます。

LPPV コンポーネントを使う簡単な Mesh Renderer の例
LPPV コンポーネントを使う簡単な Mesh Renderer の例

上のシーンでは、光を大量に放射するマテリアルを使った平面が二つ、床の上にあります。注意点は以下の通り:

  • LPPV コンポーネントを使用するとき、アンビエントライト (ambient light) はジオメトリをまたいで変化します。ジオメトリの両サイドで不変の色を作成するには、1 つの補間したライトプローブを使用します。

  • ジオメトリは静的なライトマップを使用せず、球が補間したライトプローブを表します。それらは Gizmo Renderer に属します。

コンポーネントの使い方

補間したライトプローブの 3D グリッドが生成されるエリアは Bounding Box Mode プロパティーの設定によって変化します。

3 つの選択が可能です。

Bounding Box Mode 機能
Automatic Local (デフォルト) ローカル空間のバウンディングボックスを計算し、補間されたライトプローブの位置がそのバウンディングボックス内に生成されます。ゲームオブジェクトに Renderer コンポーネントがアタッチされていない場合、デフォルトのバウンディングボックスが生成されます。バウンディングボックスの計算には現在の Renderer と、Light Probes プロパティが Use Proxy Volume に設定されているすべての Renderer を 階層にしたものが含まれています。
Automatic World 計算されたバウンディングボックスには現在の Renderer と、Light Probes プロパティが Use Proxy Volume に設定されているすべての Renderer を 階層にしたものが含まれています。バウンディングボックスはワールド空間に合わせて配置されています。
Custom カスタムのバウンディングボックスを使用します。バウンディングボックスは、ゲームオブジェクトのローカル空間で指定されます。バウンディングボックスのエディティングツールがあります。UI の SizeOrigin を変更することにより、バウンディングボリュームを手動で編集できます。

Automatic LocalAutomatic World の主な違いは、Automatic Local モードでは、大きな階層に属するゲームオブジェクトがその親ゲームオブジェクトの LPPV コンポーネントを使用するとき、バウンディングボックスの計算負荷はより高くなります。ただし、結果的に出来上がったバウンディングボックスのサイズは小さくなります。つまり、ライティングのデータがよりコンパクトになるということです。

バウンディングボリュームの補間したライトプローブの数は Proxy Volume Resolution プロパティーによって異なります。2 つの選択肢があります。

  • Automatic (デフォルト) - 各軸の解像度は、指定した各ユニットエリアの補間したライトプローブ数とバウンディングボックスのサイズを使って計算されます。

  • Custom - 各軸に異なる解像度を指定できます (以下を参照)。

注意 各軸の解像度は 2 の累乗である必要があります。解像度の最大値は 32 です。

Probe Position Mode は、補間したライトプローブとセル中心との相対的な位置を指定します。このオプションは、補間したライトプローブが壁やその他のジオメトリを通過して光が漏れるような状況に利用できます。以下の例では 4 x 4 グリッドの解像度を使って、 Cell CornerCell Center の違いを 2D ビューで表示しています。

比較画像

  1. Standard Shader を使った簡易な Mesh Renderer

    Light Probe Proxy Volume を使用した場合 (解像度: 4x1x1)
    Light Probe Proxy Volume を使用した場合 (解像度: 4x1x1)
    Light Probe Proxy Volume を使用しない場合
    Light Probe Proxy Volume を使用しない場合
  2. Standard Shader を使った Skinned Mesh Renderer

    Light Probe Proxy Volume を使用した場合 (解像度: 2x2x2)
    Light Probe Proxy Volume を使用した場合 (解像度: 2x2x2)
    Light Probe Proxy Volume を使用しない場合
    Light Probe Proxy Volume を使用しない場合

ShadeSHPerPixel 関数を使ったパーティクルシステムのシェーダー例

Shader "Particles/AdditiveLPPV" {
Properties {
    _MainTex ("Particle Texture", 2D) = "white" {}
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
}

Category {
    Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
    Blend SrcAlpha One
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off
    
    SubShader {
        Pass {
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_particles
            #pragma multi_compile_fog

            // ターゲットを指定
            #pragma target 3.0
            
            #include "UnityCG.cginc"
            
            // ShadeSHPerPixel にアクセスするにはこのヘッダーを入れる必要があります。
            #include "UnityStandardUtils.cginc"
                        
            fixed4 _TintColor;
            sampler2D _MainTex;
            
            struct appdata_t {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;                
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float3 worldPos : TEXCOORD2;
                float3 worldNormal : TEXCOORD3;
            };
            
            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {           
                half3 currentAmbient = half3(0, 0, 0);
                half3 ambient = ShadeSHPerPixel(i.worldNormal, currentAmbient, i.worldPos);
                fixed4 col = _TintColor * i.color * tex2D(_MainTex, i.texcoord);
                col.xyz += ambient;
                UNITY_APPLY_FOG_COLOR(i.fogCoord, col, fixed4(0,0,0,0)); // ブレンドモードのため黒くなっていくフォグ
                return col;
            }
            ENDCG 
        }
    }   
}
}

ハードウェア要件

コンポーネントには最低でも、32 ビットの浮動小数点形式とリニアフィルタリングを備えた 3D テクスチャのサポートを含む、Shader Model 4 グラフィックスハードウェアと API サポートが必要です。

正しく機能させるためには、 Light Probe Group コンポーネントによるライトプローブがシーンに必要です。要件が満たされていない場合は、Renderer、または、Light Probe Proxy Volume コンポーネントのインスペクター上に警告メッセージが表示されます。

ライトプローブとメッシュレンダラー
シーンビューにおける GI の可視化