土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

MeshRendererコンポーネントのLight Probes(ライトプローブ群)のドキュメント私訳

 MeshRendererコンポーネントのパラメータであるLight Probesは、そのメッシュがライトプローブの影響をどう受けるかをOff/Blend Probes/Use Proxy Volume/Custom Providedの4つから選択します。この値は内部的にはMeshRenderer.lightProbeUsageプロパティに設定するRendering.LightProbeUsage列挙体になります。
 ライトプローブ自体が難解な機能なのもあるのですが、Rendering.LightProbeUsageのドキュメントが例によってバージョン更新で訳が洩れていたり、機械翻訳がこなれていなくて間違ってはいないが文意が取りにくかったりしたので、私訳を載せておきます。ご自身の責任においてご利用ください(間違いがあったら指摘していただけると助かります)。

【土屋補足】

・一般に"Light Probe"は単数形複数形にかかわりなく「ライトプローブ」と訳されますが、原文では、シーンに配置されている複数のライトプローブ全体を指して「Light Probes」、それらを補間したシェーダーに渡す単一の値や機能自体のことを「Lighe Probe」と書いている傾向があるので、ここでは可能な限り厳密に「ライトプローブ」「ライトプローブ群」としています。

LightProbeUsage.Off

https://docs.unity3d.com/ja/2018.1/ScriptReference/Rendering.LightProbeUsage.Off.html
(公式訳無し)

原文:Light Probes are not used. The Scene's ambient probe is provided to the shader.
私訳:ライトプローブ群は使用しません。シーンのアンビエントプローブがシェーダーに渡されます。

LightProbeUsage.BlendProbes

https://docs.unity3d.com/2018.3/Documentation/ScriptReference/Rendering.LightProbeUsage.BlendProbes.html
https://docs.unity3d.com/ja/2018.2/ScriptReference/Rendering.LightProbeUsage.BlendProbes.html(2018.3から公式訳無し)

原文:Simple light probe interpolation is used.
公式訳:簡易なライトプローブ補間が使用されています。
私訳:シンプルなライトプローブ補間が使用されます。

原文:If baked light probes are present in the Scene, an interpolated light probe will be calculated for this object and set as built-in shader uniform variables.
公式訳:シーンにベイクしたライトプローブがある場合は、補間したライトプローブは、オブジェクトのために計算されビルトインシェーダーのユニフォーム変数として設定されます。
私訳:シーンにベイクされたライトプローブ群がある場合、このオブジェクト用に補間されたライトプローブが演算され、組み込みのシェーダー定数群(shader uniform variables)に代入されます。

原文:Surface shaders use this information automatically.
公式訳:表面シェーダーはこの情報を自動的に使用します。
私訳:サーフェイスシェーダーはこのデータを自動的に使用します。

原文:To add light probe contribution to your custom non-surface shaders, use ShadeSH9(worldSpaceNormal) in your vertex or pixel shader.
公式訳:ライトプローブの影響をカスタムの表面シェーダー以外のシェーダーに与えるためには、頂点シェーダー、または、ピクセルシェーダーの ShadeSH9 (worldSpaceNormal) を使用します。
私訳:ライトプローブの影響をカスタムの(サーフェイスシェーダーではない)シェーダーに加える場合、頂点シェーダーあるいはピクセルシェーダーでShadeSH9(worldSpaceNormal)を使用します。

LightProbeUsage.UseProxyVolume

https://docs.unity3d.com/2018.3/Documentation/ScriptReference/Rendering.LightProbeUsage.UseProxyVolume.html
https://docs.unity3d.com/ja/2018.3/ScriptReference/Rendering.LightProbeUsage.UseProxyVolume.html

原文:Uses a 3D grid of interpolated light probes.
公式訳:3D グリッド補間のライトプローブが使用されています。
私訳:ライトプローブ群の補間に3Dグリッドを使用します。

原文:A Light Probe Proxy Volume component which may reside on the same game object or on another game object will be required.
公式訳:同じゲームオブジェクトか他のゲームオブジェクトにある Light Probe Proxy Volume コンポーネントが必要です。
私訳:そのGameObject自身あるいは別のGameObjectにアタッチされたLight Probe Proxy Volumeコンポーネントが必要です。

原文:In order to use a Light Probe Proxy Volume component which resides on another game object, you must use the Proxy Volume Override property where you can specify the source game object.
公式訳:他のゲームオブジェクトにある Light Probe Proxy Volume コンポーネントを使用するためには、Proxy Volume Override プロパティーを使ってソースのゲームオブジェクトを指定します。
私訳:他のGameObjectにアタッチされたLight Probe Proxy Volumeコンポーネントを使用する場合は、Proxy Volume Overrideプロパティを使用して、参照先のGameObjectを指定します。

原文:Surface shaders use the information associated with the proxy volume automatically.
公式訳:表面シェーダーは、自動的にプロキシボリュームと紐づいた情報を使用します。
私訳:サーフェイスシェーダーは自動的にプロキシーボリュームを反映したデータを使用します。

原文:To use the proxy volume information in your custom shaders, you can use ShadeSHPerPixel function in your pixel shader.
公式訳:プロキシボリューム情報をカスタムシェーダーで使用するには、ピクセルシェーダーの ShadeSHPerPixel 関数を利用します。
私訳:自身のカスタムシェーダーにプロキシーボリュームのデータを使用する場合は、ピクセルシェーダーでShadeSHPerPixel関数を使用します。

【土屋補足】

・シーン内に配置されたライトプローブ群(Light Probes)は、シェーダーが実行される直前に補間計算をして、1個のSH関数(ドキュメントでは"Light Probe","Probe"と書かれることが多い)に変換され、これがシェーダーに渡されます。
・ライトプローブの配置間隔よりも描画オブジェクトの方が大きい場合などでも、シェーダーにはそれら複数のライトプローブを補間した1個のデータしか渡さないため、意図しない描画結果になることがあります。
・これを解決する手段としてLPPV(Light Probe Proxy Volume)コンポーネント用意されています。LPPVは通常描画対象のオブジェクトにアタッチしておきますが、別のオブジェクトにアタッチされたLPPVを使うこともできます(その際には参照設定が必要になります)。
・LPPVについては公式ドキュメントを参照: https://docs.unity3d.com/ja/2018.3/Manual/class-LightProbeProxyVolume.html このページはすごくわかりやすい。やるじゃん!

LightProbeUsage.CustomProvided(★2018.1から追加)

https://docs.unity3d.com/ja/2018.3/ScriptReference/Rendering.LightProbeUsage.CustomProvided.html
(公式訳無し)

原文:The light probe shader uniform values are extracted from the material property block set on the renderer.
私訳:ライトプローブのシェーダ定数群(shadar uniform values)をレンダラーに設定するマテリアルプロパティブロックから展開します。

原文:Property unity_SHAr, unity_SHAg, unity_SHAb, unity_SHBr, unity_SHBg, unity_SHBb and unity_SHC will be set to zero if they are not part of the MaterialPropertyBlock.
私訳:MaterialPropertyBlockに"unity_SHAr","unity_SHAg","unity_SHAb","unity_SHBr","unity_SHBg","unity_SHBb","unity_SHC"プロパティを加えなかった場合、それらはゼロに設定されます。

原文:Property unity_ProbesOcclusion will be calculated as in normal lighting if it is not part of the MaterialPropertyBlock.
私訳:MaterialPropertyBlockに"unity_ProbesOcclusion"プロパティを含めなかった場合、ノーマルライティングとして演算されます。

原文:Note that using the light probe values baked at a different place may lead to incorrect rendering, especially when local lights (i.e. point lights and spot lights) are used.
私訳:他の地点でベイクしたライトプローブの値を使用すると、特に局所的な光源(ポイントライトやスポットライトなど)の際に、正しくないレンダリングをもたらすことに注意してください。

原文:This mode is more useful when drawing instanced objects with Graphics.DrawMeshInstanced, where the light probe data is pre-calculated and provided as arrays.
私訳:このモードは、
Graphics.DrawMeshInstancedでインスタンスオブジェクトを描画する時に、ライトプローブのデータが事前演算され、かつ配列で用意されている場面で有効です。

【土屋補足】

・MaterialPropertyBlockは、UnityEngine.CoreModuleOtherで実装されているクラスで、変数名をキーに値を設定/取得できます。これを介して、Renderer.SetPropertyBlock()でシェーダーに渡すライトプローブの係数を直接指定できるようです。

[asin:4862464130:detail]