LOPsの仕組み


この記事では、Houdini18.0で新しく実装されたオペレータである、LOPs(Lighting Operator)について紹介します。

プロシージャルUSD

USDを編集するには、プリミティブのツリーとプリミティブのプロパティに変更を適用する必要があります。 ツリー上のプリミティブを選択してパラメーターを直接編集できるプログラムは、ノードの手続き型ネットワークをクッキングする副作用としてツリーを生成/編集するHoudiniよりも理解しやすいかもしれません。 ただし、プロシージャルのパラダイムには、USDを操作するためのいくつかの魅力的な利点があります。

  • USDの動的生成
    USDは本質的に動的ではありません。 Solarisでは、USDの上の動的レイヤーとして機能し、エクスプレッション、グローバル変数、スクリプト、データベースクエリ、または必要なその他の入力に基づいて異なるUSD出力を生成できます。
      
  • プロシージャルなUSD生成
    たとえば、100個のライトのインスタンスが必要な場合、100個の参照を記述する必要はなく、for-eachループを使用して簡潔に作成することが可能です。
     
  • より高いレベルでの動作
    たとえば、現在USDには制約がありません。 Solarisは、LOPネットワークで「ライブ」ですが、USDを出力するときにベイクアウトされるLook Atなどの制約を提供します。
     
  • より高度な再利用性
    LOPネットワークの有用な部分を再利用可能なデジタルアセットにバンドルします。

 

USDを使用する方法

Solarisを使用して、スタジオのUSDへの依存度やパイプラインの場所に応じて、さまざまな方法でUSDを操作できます。
たとえば、次のワークフローでは、HIPファイルとUSDファイルをさまざまな方法で使用します。

  • 空のHIPファイルから始めて、LOPネットワークを構築し、最後に他の人が利用できるようにUSD(たとえば、シミュレートされたジオメトリをベイク)を書き出します。
     
  • USDファイルから始めて、LOPネットワークに取り込み、それを修正し、追加し、最後に修正されたUSDを書き出します。
     
  • HIPファイルを作成して、LOPネットワークでUSDアセットを生成します。 次に、LOPを使用してこれらのアセットをロードし、それらを結合してより大きなシーン/ショットにする「高レベル」HIPファイルを作成します。

USDで覚えておくべき重要なことの1つは、「アセット」は単なるジオメトリやテクスチャを意味するものではないということです。 USDアセットは、作成および改訂の複数のレイヤーを表し、他のファイル(テクスチャやインポートされたジオメトリなど)との関係を持っている場合があります。

 

レイヤー

LOPノードの機能を理解するのには、LOPがUSDレイヤーを処理する方法を理解することが近道となります。

  • すべてのLOPノードの出力は、完全に構成されたUSDステージです。
     
    • 入力と出力を持つノードは入力ステージを取得し、変更する必要があるプリミティブの変更されたコピーを持つ新しいステージを作成し、変更されたステージを出力します。
    • ステージのルートレイヤーは、サブレイヤーのスタックを除き、常に空です。
    • これらのサブレイヤーは、LOPノードによって作成される場合があります。その場合、メモリ内にのみ存在する匿名レイヤー(たとえば、SOP Import LOPはSOPネットワークからジオメトリをインポートします)、またはディスク上のレイヤー(Sublayer LOP ディスクからUSDファイルをインポートします。)になります。
    • LOPノードでは、ディスクからロードされたレイヤーを直接変更することはできません。 編集は、ロードされたレイヤーの上のオーバーライドレイヤーに移動します。
       
  • 通常、編集を適用するLOPは、サブレイヤースタック内の最も強力なメモリ内レイヤーに入ります。
     
    • ルートレイヤーは空であるため、これはLOPノードがステージ上で最も強い意見を持つレイヤーを常に編集していることを意味します。 これにより、各LOPノードによって適用された編集は、ステージ内の他の強力な意見によって上書きされないため、常に表示されます。
    • 最も強力なサブレイヤーがディスク上のファイルである場合、編集を行う次のLOPノードは、編集を保持するために匿名のメモリ内レイヤーを自動的に作成します。 ネットワークはディスクからレイヤーを変更することはなく、上位レイヤーのレイヤーのみをオーバーライドします。
    • Solarisは、ターゲットの編集というUSDの概念を使用しません。 ただし、Load Layer、Layer Replace、Edit Target Layerなどの特殊なノードを使用して同様の結果を得ることができます。
       
  • 現在最も強力なメモリ内の匿名レイヤーは、アクティブレイヤーと呼ばれます。
     
  • 一部のLOPノードは、サブレイヤースタック自体を変更します。
     
    • Sublayer LOPは、USDファイルからサブレイヤーをロードします。
    • 一部のLOPノード( Layer Break LOP、Configure Layer LOP など)は、スタックの最上部に新しい匿名レイヤーを作成できます。 これらは、どの編集が異なるレイヤーにあるか(および異なるUSDファイルに保存されるか)を完全に制御する必要がある場合に役立ちます。
    • LOPノードにはデバッグフラグがあります。 このフラグがオンの場合、常に独自の個別のレイヤーに配置され、ノードによって行われた変更が常に分離して検査しやすくなります。
    • Stage Manager LOPは、レイヤースタックを単一の新しい匿名アクティブレイヤーに統合し、その1つのレイヤーを編集できます。
    • Sublayer LOPおよび参照は、レイヤーを合成的に同等の形式に再配置できますが、ディスク上のUSDファイルのよりクリーンな構造を作成します。

 

レイヤーのディスクへの保存

USDファイルを直接書き込む「純粋なUSD」ワークフローでは、レイヤーの構成方法に基づいてデータを手動でファイルに分離します。

ネットワークのクックの結果として、多くのレイヤーをメモリ内に生成できるSolarisプロシージャルワークフローでは、Configure Layer LOPを使用して、任意のレイヤーのファイルパスを指定できます。 レイヤーにファイルパスがある場合、USDを出力すると、レイヤーは別のUSDファイルに書き込まれます。

ディスクからインポート(リファレンスまたはサブレイヤー)したレイヤーには、インポート元のファイルに設定されたファイルパスが自動的に設定されます。

 

レイヤーブレイク

レイヤーブレイクは非常に重要な概念で、ディスク上のレイヤーファイルに書き込まれる内容を制御するものです。

Layer Break LOPは以下の2つのことを行います:

  • 次のLOPノードによって変更される新しいアクティブレイヤーを開始します。
  • 既存のすべてのサブレイヤーが、レイヤー分割前に作成されたものとしてマークされます。

これはステージの構成には影響しません。 シーンビューアーでは、ブレイク前に作成されたサブレイヤーの効果が引き続き表示されます。 ただし、ブレイクにより、一部のLOPノードがレイヤーで動作する方法、およびUSDレンダリングノードがレイヤーをUSDとして書き出す方法が変わります。
基本的に、USDレンダーノードがディスク上のレイヤーファイルにレイヤーを書き込むと、レイヤーブレイク前のすべてが破棄され、ディスクには書き込まれません。

これの機能はどのような場合に便利になるでしょうか。

例えばライティング部門で作業しているとします。 セットドレッシング部門からファイルを受け取ります。 これには、セットデザイナーによって作成された/Lights/scratch_sun1と呼ばれる仮のライトのある風景が含まれています。仮のライトを削除し、プロダクション品質のライトを追加するレイヤーを作成する必要があります。

  1. Sublayer LOPを使用して、landscape.usdにロードします。
  2. Layer Break LOPを追加します。
    これは、新しいレイヤーがディスクに書き込まれるときに、このノードの上に何も含めるべきではないことを示しています。
  3. 仮のライト(/Lights/scratch_sun1)を選択し、Prune LOPを使用して非アクティブにします。
    レイヤーブレイクはメモリ内のレイヤーの構成に影響を与えないため、ライトはレイヤーブレイクの上から来たとしても選択できます。
  4. 新しいプロダクション品質のライトを追加します。
  5. lighting.usdという名前のレイヤーファイルとしてネットワークを書き出すために、USDレンダーノードを追加します。
    上記で説明したように、USDレンダーノードはレイヤーブレイクの上は何も書き込みません。 このファイルには、landscape.usdのデータがlighting.usdに含まれません。
    ただし、lighting.usdレイヤーには、/Lights/scratch_sun1を非アクティブ化するというオーバーライドが含まれています。(Pruneはレイヤーブレイクの後であり、作成したアトリビュートには影響しません。)
    もちろん、lights.usdには/Lights/scratch_sun1は存在しません。 ただし、後でlandscape.usdの上にlighting.usdを重ねると、プリミティブパスが一致し、ライトレイヤーが仮のライトを非アクティブにします。

したがって、Solarisネットワークでは、データをロードして編集のコンテキストを提供し、ネットワーク内のレイヤーブレイクノードの前に置くことにより、「コンテキストデータ」がディスクに書き込まれないようにすることができます。

 

アニメーション

・LOPノードは常に一度に1つのフレームのみをクックします。(Cache LOPを使用する場合を除く)
つまり、アニメーション化されたLOPノードを使用している場合でも、LOPノードによって作成された匿名レイヤーには、データの単一の時間サンプルしかありません。 プレイバーでフレームからフレームに移動すると、LOPノードがリクックし、レイヤーにはまだ1つのタイムサンプルしかありませんが、常に現在のフレーム番号のタイムサンプルになります。

  • USDレンダーノードを使用してUSDを書き出すと、すべてのフレームをクックし、フルタイムのサンプルをUSD出力に書き込むことができます。