Version: 2021.3
言語: 日本語
ライトプローブとシーンのロード
リフレクションプローブ

Light Probe Proxy Volume コンポーネント

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

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

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

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

レンダリングパイプラインのサポート

レンダリングパイプライン全体での Light Probe Proxy Volume コンポーネントのサポートの詳細については、レンダリングパイプライン機能の比較 を参照してください。

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

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

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

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

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

Mesh Renderer コンポーネントの 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 ビューで表示しています。

Data Format は、関連する 3D テクスチャが使用する形式を指定します。これには、2 つのオプションがあります。

  • Float (デフォルト値) - テクスチャは、32 ビット浮動小数点チャネル形式を使用して、球面調和係数を保存します。

  • Half Float - テクスチャは、半精度浮動小数点 (16 ビット浮動小数点) チャンネル形式を使用して、球面調和係数を保存します。この形式の利点は、半精度浮動小数点のリニアテクスチャサンプリングが大部分のデバイスでサポートされていることと、この形式と 32 ビット浮動小数点チャンネル形式の精度差があまりないことです。また、このデータ形式を使うと、GPU でのテクスチャサンプリングのパフォーマンスが向上します。

画像による比較

  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

            // Specify the target
            #pragma target 3.0

            #include "UnityCG.cginc"

            // You must include this header to have access to 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)); // fog towards black due to our blend mode
                return col;
            }
            ENDCG
        }
    }
}
}

ハードウェア要件

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

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

ライトプローブとシーンのロード
リフレクションプローブ