This is the documentation for Enlighten.

7.1.1.2.5. プローブの補間

概要

Enlighten Probe Solver を実行し、プリコンピュートされたプローブ位置に対するライティング値を計算した後のステップは、通常、固定されたプローブ間の位置に結果を補間し、シーンの動的オブジェクトの実際の位置に対する最終的な結果を生成することです。

Enlighten SDK には、この補間を行う関数が含まれており、EnlightenInterpolation.h で定義されています。正規グリッドとプローブ オクトリー向けの SDK 補間関数は、プリコンピュートの際に生成された追加の可視性情報を使用し、補間の結果を向上させます。

プローブのデータ要件は以下のとおりです。

  • Probe Solver を実行する場合は、m_ProbeSetPrecomp ブロックをロードする必要があります。
  • プローブを補間する必要があり、プローブ セットがオクトリーである場合、 m_InterpolationData ブロックをロードする必要があります。
  • プローブを補間する必要があり、プローブ セットがオクトリーでない場合、m_ProbeSetPrecomp をロードしていなければ (つまり、solve を実行しないのであれば) m_InterpolationData のみをロードする必要があります。
  • プローブの補間で正規グリッドまたはオクトリー向けにプリコンピュートされた可視性情報を使用する場合は、m_VisibilityData ブロックをロードする必要があります。

プローブ セットが非構造グリッドである場合、位置のアレイを提供する必要があります。非構造セット向けのプリコンピュートされた可視性情報はないため、補間では距離だけを考慮します。

プローブ セットのオフセット

大きなワールドでは、 プリコンピュートの精度またはレンダラーの精度の面から、原点周辺の個別のシーン セクションのプリコンピュートを実施することが求められます。原点周辺のプリコンピュートを行った 2 つのセクションを組み合わせる場合、特に正規グリッドのオフセット入力はないため、セクション間で適切なプローブの補間ができません。
このシナリオでは、低レベル API で Enlighten::InterpolationInputSetTransform 関数を使用して、プローブ セットのオフセットを指定します。高レベル ランタイムでは、EnqueueSetProbeSetTransform を使用できます。 

プローブの補間の例

この単純な例では、単一の入力プローブ セットから、単一の位置に補間された出力を計算します。

// プローブ補間箇所のアレイです。補間の最初のステップでは、これらはプローブ位置から計算されます。このステージにはコストがかかる可能性があり、
// オブジェクトが移動していなければ繰り返す必要がありません。m_RecomputeInterpolants フラグが false に設定されている場合、このオブジェクトは補間箇所のアレイが
// 補間タスクの前回の実行で計算されており、まだ有効であるとみなすため、この最初のステージはスキップされます。
ProbeInterpolant probeInterpolants[16];
 
// 補間の最終出力を受け取る出力アレイのアレイです。これらの値は補間の最初のステージがスキップされたとしても、
// 常に静的プローブの現在のライティング値から再計算されます。
float redOutput[SH_ORDER_L1];
float greenOutput[SH_ORDER_L1];
float blueOutput[SH_ORDER_L1];
float envVisOutput[SH_ORDER_L1];          // envVisShNumCoefficients プローブ セットのプリコンピュート パラメーターが適切な値に設定されていることに依存します。
                                          // これは環境の可視性のためにプリコンピュートされた値の間に補間するためです。 
 
// 補間された出力を計算するポイントを記述する構造体です。
InterpolatedPoint interpolatedPoint;
interpolatedPoint.m_Position = worldPosition;
interpolatedPoint.m_Interpolants  probeInterpolants;
interpolatedPoint.m_OutputFormat = PROBE_OUTPUT_FORMAT_FP32;
interpolatedPoint.m_MaxNumInterpolants = 16;
interpolatedPoint.m_NumInterpolants = 0;
interpolatedPoint.m_ShOrder = SH_ORDER_L1;
interpolatedPoint.m_EnvVisShOrder = SH_ORDER_L1;      // R、G、B と同じ順序である必要はありません。0 でも構いません。
interpolatedPoint.m_RecomputeInterpolants = true;
interpolatedPoint.m_Output[OUTPUT_R] = redOutput;
interpolatedPoint.m_Output[OUTPUT_G] = greenOutput;
interpolatedPoint.m_Output[OUTPUT_B] = blueOutput;
interpolatedPoint.m_Output[OUTPUT_ENV_VIS] = envVisOutput;
 
// ライティング結果を補間するソースとして使用できる静的プローブ セットを記述する構造体です
InterpolationInputSet interpolationInputSet;
interpolationInputSet.m_ProbeSetCore = coreData;
interpolationInputSet.m_ProbePositionArray = NULL;    // 正規グリッドまたはボクセル オクトリーでは必要ありません
interpolationInputSet.m_OutputFloat = probeLightingResults;
interpolationInputSet.m_OutputShOrder = Enlighten::SH_ORDER_L1; // プローブ セットを解決する際に使用された SH の順序を設定します 
 
// プローブの補間タスクを記述する構造体です
ProbeInterpolationTask probeInterpolationTask;
probeInterpolationTask.m_InterpolationInputs = &interpolationInputSet;
probeInterpolationTask.m_NumInterpolationInputs = 1;
probeInterpolationTask.m_InterpolatedPointArray = &interpolatedPoint;
probeInterpolationTask.m_ArrayLength = 1;
probeInterpolationTask.m_RecomputeAllInterpolants = false;    // 入力プローブ セットのリストに変更があった場合は true に設定します 
 
Geo::u32 timeInMicroseconds;
DoProbeInterpolationTask(&probeInterpolationTask, timeInMicroseconds);
 
// これで redOutput、greenOutput、blueOutput、および envVisOutput に SH 結果が含まれるようになり、インスタンスをレンダリング用のシェーダー定数としてアップロードできます