Q100311: レンダラー プラグインでのライブ レンダリングの実装

フォローする

まとめ

この記事では、ライブ レンダリングをレンダラー プラグインに実装する方法について説明し、次のトピックについて説明します。

  • 属性規約
  • RendererInfo プラグイン関数
  • レンダリングプラグインの機能
  • Python ユーティリティ
    - LiveRenderAPI
    -
    LiveRenderActions
    - コールバック
  • 落とし穴
    - 単一のサンプリングされた更新
    - 非永続的な更新

LiveRendering の一般的な説明については、 Katanaユーザー ガイドの「レンダー タイプ」セクションを参照してください。また、「レンダリングの実行」の「ライブ レンダリングの開始と停止」サブセクション、および「ライブ レンダリングの制御」のセクションも参照してください。

レンダラー プラグインの他の部分の詳細な説明、および LiveRendering に直接関係しない RenderAPI の他の機能のドキュメントについては、 Katana開発者ガイドのレンダラー プラグインのセクションを参照してください。

詳しくは

属性規約

Katanaのライブ レンダリング システムは、シーン グラフの属性を利用しています。効率の名のもと、レンダラーの更新に必要な属性のみがレンダー プラグインに送信されます。これらがどの属性であるかを決定するための属性規則があります。これは次のとおりです。

ライブレンダー。 <更新グループ> <属性名>

画像__3_.png

<updateGroup> - これは、属性を 1 つの更新にグループ化するために使用される GroupAttribute です。

<attributeName> - これは監視する最上位属性の名前です。上の画像では、 liveRender.geoXform.xform属性は、ライブ レンダー システムに対して、変更を最上位のxform属性に送信するように指示しています。これは StringAttribute であり、その値は通常 updateGroup と一致しますがこれはレガシーな理由によるものですが、通常は内部で使用されないことに注意してください。同じ更新グループで複数の属性が指定されている場合、それらの属性のいずれかが変更されるたびに、それらはすべてレンダラーに送信されます。

RendererInfo プラグイン関数

void fillLiveRenderTerminalOps( OpDefinitionQueue & terminalOps ,
                              const FnAttribute::GroupAttribute& stateArgs )

ノード グラフで上記の属性規則を設定することは可能ですが、通常は、RendererInfo プラグインのfillLiveRenderTerminalOps()関数を使用して、ライブ レンダーの開始時に属性を自動的に設定する方が便利です。この関数には、ターミナルOpsと呼ばれる引数が渡されます。これは、op タイプ ( std::stringとして) と op 引数 ( GroupAttributeとして) を含むstd::pairオブジェクトをまったく含まないか、複数の std::pair オブジェクトを含む std std::dequeです。

例えば。以下のコードは、 /root/world/lgtの下にあるライトの場所のxform属性の変更を監視します

 FnAttribute::GroupBuilder opArgs;
opArgs. set ( "type" , FnAttribute::StringAttribute( "light" ));
opArgs. set ( "location" , FnAttribute::StringAttribute( "/root/world/lgt" ));
opArgs. set ( "attributeNames" , FnAttribute::StringAttribute( "xform" ));
terminalOps.push_back( std ::make_pair( "LiveRenderFilter" , opArgs.build()));

Katanaに同梱されている、ここで役立つGeolib3 Ops がいくつかあります。

ライブレンダーフィルター

ライブ レンダリングでどの属性を監視する必要があるかを示すために使用されます。複数の属性を 1 つの LiveRenderFilter で監視でき、属性のいずれかが変更されると、すべてが 1 つの GroupAttribute として送信されます。これは、上で説明したliveRender属性規則を設定する標準的な方法です

OpArgs

-attributeNames (StringAttribute) - 属性の名前は変更を監視し、変更されるたびに単一の更新としてレンダリング プラグインに送信する必要があります

- location (StringAttribute) - この操作が適用される最初の場所を定義する CEL 式。その後、すべての子の場所に適用されます。

- exclusions (StringAttribute) - (オプション) この操作を実行しない、除外される場所の種類のリスト。

- typeAlias (StringAttribute) - (オプション) レンダリング プラグインに送信される「type」属性の名前。設定されていない場合は、代わりに場所のタイプが使用されます。

- type (StringAttribute) - (オプション) 設定すると、操作はこのタイプの場所でのみ実行されます。

-collectUpstream (IntAttribute) - (オプション)ゼロ以外の場合、各親の場所で監視されている各属性の値もライブ レンダー更新に含まれます

ライブ属性

この操作は、(操作が完了してパラメータが確定するのを待つのではなく) 操作中にビューア マニピュレータによって生成される値を保存します。この操作は、ライブ レンダリング モジュールによって特に検索される特殊なケースです。

OpArgs

この操作の引数は Live Render システムによって自動的に設定されるため、手動で設定しないでください。

LocalizeXform

すべての祖先からの場所の xform を、xform.matrix と呼ばれる単一のワールド空間行列に平坦化します。

OpArgs

- excludeCel (StringAttribute) - 操作が適用されないシーン グラフの位置を記述する CEL 式。

- addMaterialHash (IntAttribute) - (オプション) 古いバージョンのライブ レンダリングのレガシー動作。ゼロ以外の場合、「material」属性のハッシュ値は「materialHash」として保存されます。

- OutputAttrName (StringAttribute) - (オプション) 新しいローカル xform 属性を保存するために使用する名前。デフォルトは「xform」で、既存の属性が上書きされます。

LocalizeLiveAttributeXform

ビューアでの操作中、その場所の実際の xform 属性は (ペンアップするまで) 変更されません。代わりに、LiveAttribute オペレーションを使用して、一時的な xform を liveAttributes.xform に保存します。この操作は localizeXform と同様に機能しますが、この liveAttribute 規約を認識しているため、liveAttributes.xform が存在する場合は xform の代わりに使用されます。これにより、操作中に位置 xform を更新できるようになります。当然のことながら、この操作は LiveAttribute 操作の後に適用する必要があります。

OpArgs

- addMaterialHash (IntAttribute) - (オプション) 古いバージョンのライブ レンダリングのレガシー動作。ゼロ以外の場合、「material」属性のハッシュ値は「materialHash」として保存されます。

LocalizeLightListLiveRenderFilter

この演算は、標準 LiveRenderFilter 演算を特にライト リストで使用するために特殊化したものです。これは、各場所で lightList 属性に関する追加情報を作成する点を除いて、LiveRenderFilter オペレーションと同様に動作します。この情報には、ライトへのパス、ライトのリンクが現在の場所で有効になっているかどうか、親の場所で有効になっているかどうかが含まれます。この情報は、「lightLink」アップデートとしてレンダリング プラグインに送信されます。

OpArgs

-attributeNames (StringAttribute) - 属性の名前は変更を監視し、変更されるたびに単一の更新としてレンダリング プラグインに送信する必要があります

- location (StringAttribute) - この操作が適用される最初の場所を定義する CEL 式。その後、すべての子の場所に適用されます。

- exclusions (StringAttribute) - (オプション) この操作を実行しない、除外される場所の種類のリスト。

- typeAlias (StringAttribute) - (オプション) レンダリング プラグインに送信される「type」属性の名前。設定されていない場合は、代わりに場所のタイプが使用されます。

- type (StringAttribute) - (オプション) 設定すると、操作はこのタイプの場所でのみ実行されます。

-collectUpstream (IntAttribute) - (オプション)ゼロ以外の場合、各親の場所で監視されている各属性の値もライブ レンダー更新に含まれます

座標系LiveRenderFilter

これは、標準 LiveRenderFilter 演算のもう 1 つの特殊化です。座標系で使用します。この関数は LiveRenderFilter op と同じように動作しますが、最初に現在の場所が /root/world/ の globals.coodysystems 属性にリストされているかどうかを確認し、それが true の場合にのみ実行を続行する点が異なります。

OpArgs

-attributeNames (StringAttribute) - 属性の名前は変更を監視し、変更されるたびに単一の更新としてレンダリング プラグインに送信する必要があります

- location (StringAttribute) - この操作が適用される最初の場所を定義する CEL 式。その後、すべての子の場所に適用されます。

- exclusions (StringAttribute) - (オプション) この操作を実行しない、除外される場所の種類のリスト。

- typeAlias (StringAttribute) - (オプション) レンダリング プラグインに送信される「type」属性の名前。設定されていない場合は、代わりに場所のタイプが使用されます。

- type (StringAttribute) - (オプション) 設定すると、操作はこのタイプの場所でのみ実行されます。

-collectUpstream (IntAttribute) - (オプション)ゼロ以外の場合、各親の場所で監視されている各属性の値もライブ レンダー更新に含まれます

レンダラープラグインの機能

int startLiveEditing()
 int stopLiveEditing()

これら 2 つの関数はKatanaから呼び出され、ライブ レンダリングがアクティブであることと、位置の更新が予想されることを通知します。

 int processControlCommand( const std::string & command )

この関数は、 Katana UI からレンダリング プラグインへの通信方法です。 UI は、Python LiveRenderAPI.SendCommand()関数を介してコマンドを文字列として送信でき、これを任意の目的に応じてレンダリング プラグインで処理できます。

 int queueDataUpdates(FnAttribute::GroupAttribute updateAttribute)

監視対象の属性が変更されると、その新しい値がこの関数を介してレンダリング プラグインに渡されます。渡された属性には 3 つの子属性が含まれます。

  • type - 更新のタイプ (これは、属性規則セクションで上記にリストされている<updateGroup>です)
  • location - この更新の対象となるシーン グラフの場所。
  • 属性- 変更された属性の値。場所が削除されている場合は、 deleted という名前の属性が含まれることに注意してください。

この関数は、ライブ レンダー更新の受信専用の専用スレッドで呼び出されることに注意してください。

 bool hasPendingDataUpdates()

この関数は、適用すべきライブ レンダー更新がqueueDataUpdates()のキューに入れられているかどうかをレンダーブート プロセスに伝えます。

 int applyPendingDataUpdates() 

この関数はメインのレンダリング スレッドで呼び出され、キューに入れられたライブ アップデートを取得して実際に適用する必要があります。 hasPendingDataUpdates() true を返した場合にのみ呼び出されます。

Python ユーティリティ

Katanaの UI には、ライブ レンダリング エクスペリエンスの向上に役立ついくつかのユーティリティが含まれています。以下に示します。

LiveRenderAPI

この API を使用すると、 LiveRenderAPI.SendCommand()およびLiveRenderAPI.SendData()関数を使用して、カスタム コマンド (文字列) またはライブ アップデートを実行中のライブ レンダーに送信できます。また、ライブ レンダー サブシステムによって使用されている端末操作のリストをクエリおよび変更するためのさまざまな関数も備えています。これらの端末操作は、(ノードによって生成された) 現在のシーン グラフに変更を加えるのではなく、位置がいつ変更されるかを決定するために使用されます。これは、 RendererInfo::fillLiveRenderTerminalOps()への呼び出し中に渡された操作を変更する効果的な方法です。

LiveRenderActions

plugin_apis/python/BaseLiveRenderAction.py のクラスを使用して、独自のカスタム メニュー項目で [レンダリング] > [ライブ レンダリング] メニューを拡張できます。 BaseLiverRenderAction クラス (クラス自体はQtGui.QActionから派生) から派生し、メンバー関数をオーバーライドするだけです。これにより、クラスは LiveRenderAPI を含むKatanaの Python API を利用できるようになり、カスタム コマンドや更新をレンダリング プラグインに送信できるようになります。 LiveRenderActions のインスタンスは、UI セッション中にのみロードが試行されるように、$KATANA_RESOURCES/UIPlugins ディレクトリに配置する必要があります。

コールバック

ライブ アップデートまたはライブ レンダー コマンドをレンダー プラグインに送信する前に、 Katanaそれぞれ onLiveRenderUpdate または onLiveRenderCommand という名前のコールバックをトリガーします。これらのコールバックには、レンダリング プラグインに渡されるコマンドまたは更新属性が渡されます。これは主に監視を目的としており、レンダリング プラグインに渡されるデータを検査できますが、例外を発生させてメッセージの送信を防ぐこともできます。ただし、これによりKatanaのメッセージ ログにエラー メッセージが記録されます。

落とし穴

単一のサンプリングされた更新

レンダリングが開始されると、geolib はモーション ブラーなどを可能にするマルチサンプル属性を生成します。ただし、 Katana UI では、通常、属性は単一のサンプルを使用してのみ取得され、ライブ レンダーの更新はKatana UI から取得されます。これは、ライブ更新中に送信される属性には通常、単一の時間サンプルしか含まれないことを意味します。

非永続的な更新

レンダリングが開始されると、シーンを生成するための op ツリーがKatanaによってディスクに書き込まれ、独自の Geolib3 ランタイムを使用するレンダリング プロセスによって読み取られます。レンダリング プラグインには、シーン グラフとその属性をクエリするために、SceneGraphIterator へのアクセスが与えられます。ただし、このシーンは不変です。ライブ レンダー更新がKatanaから渡されると、Geolib3 ランタイムを更新できません。これは、レンダリング プラグインがライブ更新を受信した場合でも、SceneGraphIterators は常に元のシーンを返すことを意味します。したがって、SceneGraphIterator を安全に使用して追加情報を取得することはできないため、ライブ アップデート属性にはレンダー プラグインが必要とするすべての情報が含まれていることが要件となります。

    私たちはそれを聞いて申し訳ございません

    理由をお聞かせください