This is the documentation for Enlighten.
7.1.1.2.2. イラディアンスのための解決
概要
シーンのすべての入力ライティング (または、少なくとも解決したい対象との依存関係にあるシステムへのすべての入力) を計算し決定した後の次のステップは、メインのラジオシティ解決タスクです。以下の手順で構成されます。
1.構造体の準備
まず、タスクを記述する構造体を準備します。
RadIrradianceTask irradianceTask; irradianceTask.m_CoreSystem = radCore;
2.入力ワークスペースのリストを準備します。
ソルバーには、各依存関係に対して入力ライティング バッファのリストを 1 つ、正しい順序で渡す必要があります。以下のコード例で示すように、このリストを準備するためのヘルパー関数があります。
必ず渡さなければならない唯一の入力ライティング バッファは、解決したいシステムに対応したものです。その他は任意です。ただし、存在していないシステムからライトは転送されません。
irradianceTask.m_InputLighting = GEO_NEW_ARRAY(const InputLightingBuffer*, Enlighten::GetInputWorkspaceListLength(radCore)); Enlighten::PrepareInputLightingList(radCore, const_cast<const InputLightingBuffer**>(&inputLightingBuffer), 1, irradinceTask.m_InputLighting); // 入力ライティング バッファを正しく並べたリストを準備します irradianceTask.m_Environment = emissiveEnvironment; // オプションのエミッシブ環境 irradianceTask.m_OutputFormat = Enlighten::ENLIGHTEN_FORMAT_FP16; // 16 ビット浮動小数点ベクトルとしての出力値 irradianceTask.m_OutputScale = 1.0f; // 出力に対する追加のスケーリングなし irradianceTask.m_OutputStride = radCore->m_MetaData.m_OutputWidth; // ここではストライド = 幅とみなしていますが、常に正しいわけではありません。 irradianceTask.m_IrradianceOutput = irradianceOutput; // 一時的な最適化を使用する場合、永続である必要があります irradianceTask.m_PersistentData = persistentData; // 一時的コヒーレンスとフレーム間で持続するその他データに必要です。 irradianceTask.m_TemporalCoherenceThreshold = 0.01f; // 一時的最適化を使用しない場合は -1 に設定します
このコード例は、16 ビット浮動小数点形式でイラディアンス出力を要求しています。ただし、この半分のメモリでイラディアンス データを格納しても、品質的にほぼ違いが見られないレベルにすることが可能です。トレードオフとして、値をデコードするための最終シェーダーでの命令が少し増えます。その他の情報については、イラディアンスの LRB 圧縮出力形式をご覧ください。
3.イラディアンスのための解決
ここで、イラディアンス解決のために関数を呼び出し、タスク構造体とワーキング メモリのスクラッチ領域を渡します。
Geo::u32 timeTakenInMicroseconds, numSolvedPixels; bool success = SolveIrradianceTask(&irradianceTask, irradianceWorking, timeTakenInMicroseconds, numSolvedPixels);
一時的なコヒーレンス最適化が使用された場合、ライティングの変化を見逃さないためにすべてのシステムを同期しておく必要があります。それでも、solve
の代わりに Freeze
関数を使用することで一部のシステムの更新頻度を下げることができます。FreezeIrradianceTask
は、一時的な最適化に必要なライトの変化を追跡するために必要な、最小限のハウスキーピング処理を実行しますが、出力テクスチャは更新されません。入力パラメーターは、SolveIrradianceTask
のものとまったく同じです。
Geo::u32 timeTakenInMicroseconds, numSolvedPixels; bool success = FreezeIrradianceTask(&irradianceTask, irradianceWorking, timeTakenInMicroseconds, numSolvedPixels);
4.テクスチャへのデータ配置
最後に、出力データが書き出されたときに、アプリケーションによって GPU から確認可能なテクスチャにデータが配置され、最終的な画面上のレンダリングで使用されます。