Q100311: カスタムレンダラープラグインでライブレンダリングを実装する方法

まとめ

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

  • 属性規則
  • RendererInfoプラグイン関数
  • レンダリングプラグイン機能
  • Pythonユーティリティ
    - ライブレンダリングAPI
    -
    ライブレンダーアクション
    - コールバック
  • 落とし穴
    - 単一サンプル更新
    - 非永続的な更新

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

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

詳細情報

属性規則

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

liveRender.<updateGroup>.<attributeName>

画像__3_.png

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

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

RendererInfoプラグイン関数

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

上記の属性規則をノードグラフ内で設定することも可能ですが、通常はRendererInfoプラグインのfillLiveRenderTerminalOps()関数を使用して、ライブレンダリングの開始時に属性を自動設定する方が便利です。この関数にはterminalOpsという引数が渡されます。これはstd::dequeで、op型( std::string )とop引数( GroupAttribute型)を含む0個以上のstd::pairオブジェクトを含みます。

例: 以下のコードは/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で複数の属性を監視でき、いずれかの属性が変更された場合、すべてが単一のGroupAttributeとして送信されます。これは、前述のliveRender属性の規約を設定するための標準的な方法です。

オペアルグス

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

- location (StringAttribute) - このオペレーションが適用される最初の場所を定義するCEL式。このオペレーションは、すべての子の場所に適用されます。

-除外(StringAttribute) - (オプション) このオペレーションが実行されない除外場所タイプのリスト。

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

- type (StringAttribute) - (オプション) 設定されている場合、オペレーションはこのタイプの場所でのみ実行されます。

- collectUpstream (IntAttribute) - (オプション) ゼロ以外の場合、各親の場所にある各監視対象属性の値もライブ レンダリング更新に含まれます。

ライブアトリビュート

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

オペアルグス

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

ローカライズXフォーム

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

オペアルグス

- excludeCel (StringAttribute) - オペレーションを適用しないシーン グラフの場所を記述する CEL 式。

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

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

ライブ属性Xフォームのローカライズ

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

オペアルグス

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

ローカライズライトリストライブレンダリングフィルター

このオペレーションは、標準のLiveRenderFilterオペレーションをライトリスト専用にカスタマイズしたものです。LiveRenderFilterオペレーションと同様に動作しますが、各位置のlightList属性に関する追加情報を作成する点が異なります。この情報には、ライトへのパス、現在の位置でライトリンクが有効になっているかどうか、親位置で有効になっているかどうかが含まれます。この情報は、「lightLink」更新としてレンダリングプラグインに送信されます。

オペアルグス

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

- location (StringAttribute) - このオペレーションが適用される最初の場所を定義するCEL式。このオペレーションは、すべての子の場所に適用されます。

-除外(StringAttribute) - (オプション) このオペレーションが実行されない除外場所タイプのリスト。

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

- type (StringAttribute) - (オプション) 設定されている場合、オペレーションはこのタイプの場所でのみ実行されます。

- collectUpstream (IntAttribute) - (オプション) ゼロ以外の場合、各親の場所にある各監視対象属性の値もライブ レンダリング更新に含まれます。

座標系LiveRenderFilter

これは標準のLiveRenderFilterオペレーションのもう一つの特殊化です。座標系で使用します。LiveRenderFilterオペレーションと全く同じ動作をしますが、最初に現在の位置が/root/world/globals.coordinatesystems属性に記載されているかどうかを確認し、該当する場合にのみ実行を続行します。

オペアルグス

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

- location (StringAttribute) - このオペレーションが適用される最初の場所を定義するCEL式。このオペレーションは、すべての子の場所に適用されます。

-除外(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()関数Katana介して文字列としてコマンドを送信でき、レンダリングプラグインでは任意の目的でこれを処理できます。

 int queueDataUpdates(FnAttribute::GroupAttribute updateAttribute)

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

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

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

 bool hasPendingDataUpdates()

この関数はqueueDataUpdates()にキューに入れられた、適用する必要があるライブ レンダリング更新があるかどうかを renderboot プロセスに通知します。

 int applyPendingDataUpdates() 

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

Pythonユーティリティ

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

ライブレンダリングAPI

このAPIを使用するとLiveRenderAPI.SendCommand()およびLiveRenderAPI.SendData()関数を使用して、実行中のライブレンダリングにカスタムコマンド(文字列)またはライブアップデートを送信できます。また、ライブレンダリングサブシステムで使用されているターミナルオペレーションのリストを照会および変更するための様々な関数も備えています。これらのターミナルオペレーションは、現在のシーングラフ(ノードによって生成されたもの)を変更するのではなく、場所が変更されたかどうかを判断するために使用されます。これはRendererInfo::fillLiveRenderTerminalOps()の呼び出し中に渡されたオペレーションを実質的に変更する方法です。

ライブレンダーアクション

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

コールバック

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

落とし穴

単一サンプル更新

レンダリングが開始されると、geolib はモーションブラーなどを可能にするために、マルチサンプルの属性を生成します。しかし、 Katana UI では、属性は通常単一のサンプルを使用してのみ取得され、ライブレンダリングの更新はKatana UI から行われます。つまり、ライブ更新中に送信される属性は通常、単一のタイムサンプルのみを持ちます。

非永続的な更新

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

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

    理由をお聞かせください