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

Light Probe Proxy Volume component

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

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

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

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

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

See render pipeline feature comparison for more information about support for the Light Probe Proxy Volume component across render pipelines.

When to use the component

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

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

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

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

When you set the Light Probes property in the Mesh Renderer component to Use Proxy Volume, the GameObject must have a Light Probe Proxy Volume (LPPV) component attached. You can add a LPPV component on the same GameObject, or you can use (borrow) a LPPV component from another GameObject using the Proxy Volume Override property. If Unity cannot find a LPPV component in the current GameObject or in the Proxy Volume Override GameObject, a warning message is displayed at the bottom of the Renderer.

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

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

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

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

How to use the component

補間したライトプローブの 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 でのテクスチャサンプリングのパフォーマンスが向上します。

Images for comparison

  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 を使用しない場合

Particle System sample Shader using the ShadeSHPerPixel function

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

Hardware requirements

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

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

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