This is the documentation for Enlighten.

7.15. プローブ LOD

概要

Enlighten は、プローブの詳細度ソリューションをサポートします。プローブ LOD 機能により、プローブ セット内のプローブのサブセットを解決できます。プローブ LOD 機能を使用することにより、特にプローブが密に配置されたプローブ セットの解決時間を削減できます。

プローブ LOD 機能には、以下の制限があります。

自動プローブ配置で生成されたプローブは、オクトリー内の深度に基づき LOD にグループ分けされます。

解決時間

プローブの密度が高いシーンでは、プローブ LOD 使用のメリットが大きくなります。

ベース LOD

High Level Runtime API には、オクトリー プローブ ボリュームから生成された各プローブ セットに関して、解決されるプローブの数を制限するメカニズムがあります。ベース LOD パラメーターは、プローブ セットが解決される詳細度を指定します。このレベルおよびそれ以下の詳細度のすべてのプローブが解決されます。デフォルトのベース LOD 設定は 0、LOD0 であり、可能な最大の詳細度でプローブ セットを解決し、プローブ LOD 機能を使用しない場合と同じになります。通常、プローブ セットと視点との距離に基づきベース LOD レベルを選択する必要があります。

以下のスクリーンショットは、ベース LOD レベル 4 で解決されたオクトリー プローブ セットを表しています。ここでは、灰色で表示されているレベル 4 から 6 の LOD レベルのプローブが解決されています。詳細度の高いプローブは解決されていません (赤で表示されている LOD レベル 0 から 3)。

プローブ セットは、特定の更新レートで解決されます。これは、プローブ LOD 機能が使用されていない場合にも発生しますが、機能を使用している場合はプローブ セットのサブセットのみが解決されます。

より詳細度の高い LOD

プローブ解決と補間は分離されているため、まだ解決されていない、レンダリング スレッドで、より高い詳細度のレベルからサンプリングする準備ができている場合は問題が生じる恐れがあります。通常、これはカメラがプローブでライティングされたエリアに近づき、レンダラーがより高い詳細度のライトをサンプリングすることを選択した場合に発生します。

それらのレベルの解決中にレンダリング スレッドを停止するのではなく、一部のデータを (若干古くても) いつでも利用可能にするように定期的により高い詳細度を解決することをお勧めします。

High Level Runtime API には、より詳細度の高い LOD が更新されるレートを指定する機能があります。

実行時のプローブ セットの解決

高レベル ランタイム

プローブ セットを解決するためのベース LOD レベルを設定するには、BaseProbeSet クラスの SetLod メンバー関数を使用します。これを行うには、BaseProbeSet::SetLod(lod) 関数を呼び出し、lod パラメーターの値を設定します。

指定された LOD レベルでプローブ セットを解決するステップは以下のとおりです。

  1. プローブ セットを割り当て、Update Manager に追加します。
  2. プローブ セットに対して BaseProbeSet::SetLod 関数を呼び出し、解決する LOD レベルを指定します。デフォルトのレベルは 0 です。
  3. オプションとして、BaseProbeSet::SetFramesPerUpdate 関数 を呼び出し、ベース LOD でプローブ セットを解決する頻度を指定します。
  4. オプションとして、BaseProbeSet::SetFramesPerUpdateForLod 関数を呼び出し、ベース LOD よりも高い詳細度でプローブ セットを解決する頻度を指定します。

次の解決の際、プローブ セットは指定された LOD レベルで解決されます。

低レベル ランタイム

ソルバーに、LOD0 以外の LOD レベルでプローブ セットを解決するよう指示するには、EntireProbeSetTask クラスのm_SelectedLodm_LastSolvedLod メンバーを使用します。

指定された LOD レベルでプローブ セットを解決するステップは以下のとおりです。

  1. EntireProbeSetTask::m_SelectedLod メンバーを特定の LOD レベルに設定します。
  2. EntireProbeSetTask::m_LastSolvedLod メンバーを、以前このプローブ セットの解決に使用した値に設定します。 m_LastSolvedLod を設定し、時間的なコヒーレンスを適切に扱えるようにすることが重要です。
  3. SolveEntireProbeSetTask を呼び出します。

プローブ補間

Enlighten のプローブ補間 API のプローブ LOD のサポートは限定されており、機能を最大限活用するには、カスタム プローブ補間ソリューションを導入することをお勧めします。

補間が必要なプローブを決定するには、以下のようにヘルパー関数 GetOctreeNumLodsGetOctreeNumProbesLodGetOctreeNumVirtualProbesLod を使用します。

  1. プローブ セットの LOD レベルの合計数を判断するには、GetOctreeNumLods を呼び出します。
  2. 各 LOD レベルについて、GetOctreeNumProbesLod を呼び出してこの LOD レベルの実プローブの数を判断します。
  3. 各 LOD レベルについて、GetOctreeNumVirtualProbesLod を呼び出してこの LOD レベルの仮想プローブの数を判断します。

以下のように考えて問題ありません。

  • 実または仮想プローブは最低の詳細度から最高の詳細度の順、つまり GetOctreeNumLods(...)-1 のプローブ、次に GetOctreeNumLods(...)-2、というように順序付けられています。これは、最高の詳細度の LOD である 0 まで続きます。
  • RadProbeSetMetaData::m_NumProbes 以上のインデックスを持つプローブは仮想プローブです。

サンプリングするプローブを選択するプロセスを簡素化するため、プローブを解決するための設定に対応した LOD にあるプローブからサンプリングすることをお勧めします。ただし、m_SelectedLod を設定したことによりトリガーされた新しいベース LOD レベルがまだ保留中である可能性があります。従って、高い詳細度の LOD を低い更新レートで定期的に解決することをお勧めします。これにより、若干古いデータで補間を進めることができます。

プローブ バウンスと破壊

プローブ バウンス破壊の両方について、間接光が近接するプローブからサンプリングされます。低い詳細度の LOD からプローブ セットを解決する場合は、このバウンス リサンプリングで LOD レベルを意識する必要があります。

高レベル ランタイム

高レベル ランタイムは、バウンス リサンプリングを自動で実行できます。プローブ LOD をプローブ バウンスまたは破壊とともに使用する際、UpdateManagerPropertiesm_UseProbeSetLod オプションを有効にします。このオプションを有効にすると、 BaseSystem が各 LOD の補間向けにメモリを割り当てます。

Enlighten の更新中、InterpolationInputSetsBaseProbeSet::m_SelectedLod の値から使用されている LOD レベルを判断します。

低レベル ランタイム

UpdateProbeBounceBuffer を呼び出して、指定されたプローブ セットからバウンスをリサンプリングします。ProbeBounceWorkspace は、解決される最低の詳細度 LOD インデックスに対応する LOD の数に 1 つ追加して作成する必要があります。

GeoRadiosity のサポート

GeoRadiosity には、プローブ LOD の解決のデバッグに役立つ Lua コマンドがあります。

以下に例を示します。

  • app.SetProbeSetLod(probeSetIndex, lodLevel). これにより、ハードコーディングされた LOD 解決値を特定のプローブ セットに設定する、または probeSetIndex = -1 によりすべてに設定できます。
  • app.SetProbeSetFramesPerUpdate(probeSetIndex, framesPerUpdate, baseLevel). これにより、特定のプローブ セットまたは probeSetIndex = -1 を設定してすべてのプローブ セットに、現在のベース LOD またはより高い詳細度レベルの更新レートを設定できます。

詳細については、Lua バインディングのリファレンスをご覧ください。