NUKE GUIでの作業中に、処理が重いノードをバイパスするためにエクスプレッションで$guiを使用する

こちらの記事では、NUKEのGUIモードで作業している際に、処理が重いノードに対して、GUIモードでは処理を行わせず、レンダリング時のみノードの効果を適用する方法について紹介致します。

 

▼概要

NUKEのスクリプト(.nkファイル)が大きくなり、かなりの数のノードが含まれてくると、スクリプトの処理が反映されるまでに時間がかかるようになります。 これは特に、計算に多くの処理能力を必要とするノードで、スクリプトでの作業時に遅れが生じる可能性があります。

 

遅れが生じ、作業が困難になるようなスクリプトの場合、GUIの処理を無効にするのに便利なエクスプレッションの演算子があります。 この演算子は 「$gui」といい、こちらの記事では、パフォーマンスを向上させるために使用できるノードのエクスプレッションの方法と、それがどのように動作するかについて紹介致します。

 

 

▼詳細

エクスプレッションの 「$gui」演算子は結果として1または0を返します。

  • GUIを通してノードが計算される時は、「1」が返されます。
     
  • ノードがGUIによって処理されていない時、レンダリング時には 「0」が返されます。

これは非常に便利です。特に、NukeのGUI環境を使用せずにレンダリングする方法があるため、レンダリングには便利です。

ノードに追加する基本的な方法は、エクスプレッションを使用することです。機能的にはSwitchノードと同じように動作しますが、この方法はGUIが使用されているかどうかによって自律的に判断し、動作します。

 

NUKEのGUIモードを使用している際に、遅くなる可能性のある処理の重いノードの例をいくつか紹介致します。

  • BlinkScript
  • Convolve
  • Denoise
  • Defocus
  • Kronos
  • MotionBlur
  • OFlow
  • VectorGenerator
  • ZDefocus 

 

ご注意:これらのノードはGPUアクセラレーション対応ノードであり、高速なグラフィックスカードを使用している場合は、エクスプレッションの 「$gui」演算子は必要でない可能性があります。ただし、遅延が発生している場合は、GPUアクセラレーションと組み合わせてエクスプレッションで「$gui」を使用すると役立ちます。

 

 

▼使用方法

「$gui」演算子は、いくつかの方法でスクリプト(.nkファイル)内で使用できます。 最も一般的に使用される方法は次のとおりです。

 

ご注意:これらの3つの方法を、ご自身の.nkファイルでこちらの方法を検証および適用できるように、こちらの記事には.nkファイルも添付しております。この.nkファイルは当記事の最後よりダウンロードいただけます。

 

Switchノードを使用する方法

Switchノードを使用する方法は、エクスプレッションで 「$gui」演算子を使用する最も一般的な方法です。 他の方法とは異なり、不要になったときはSwitchノードを無効にして、エクスプレッションを無効化することができます。

これは、以下の手順で設定できます。

  1. 処理の重いノードの下流にSwitchノードを作成します。
  2. Switchノードの[which]の値を右クリックし、[Add expression …]を選択します。
     

     
  3. [expression]ボックスに$guiと入力します。 ノードはNuke GUI内で処理されるため、[result]には1と表示されます。
     

     
  4. 0インプットを処理の重いノード(この例では[Shutter Samples]20MotionBlurノード)に接続します。
     
  5. 処理の重いノードの前のノードツリー(この例ではTransformノード)に1インプットを接続してください。
     
  6. GUIを使用してViewerを再生すると、MotionBlurノードをバイパスし、最終画像に適用されたブラーの結果を表示しないため、処理が高速に実行されます。
     

     
  7. [Render in Background]を使用する、またはNuke 11で[Frame Server]を使用することで、MotionBlurノードを処理し、最終結果をディスクに書き出すことができます。これは、Nuke GUIを使用しない外部プロセスを使用し、 その間スクリプトの操作は遅くなりません。
     

ご注意:バックグラウンドで、もしくはFrame Serverを経由してレンダリングを行わない場合、レンダリングはNuke GUIと同じプロセスを使用し、期待どおりに動作しません。

  1. レンダリングが完了すると、モーションブラーが適用された結果が処理され、次のように表示されます。
     

 

無効にする方法

無効にする方法は、 Switchノードを使用するのではなく、ノードの設定で [disable]オプションを使用します。 これはノードが少なく少し洗練されていますが、エクスプレッションを無効化するのは難しいです(エフェクト内容を確認するためにはエクスプレッションを削除する必要があります)。

  1. MotionBlurノードの[disable]オプションを右クリックし、[Add expression…]を選択してエクスプレッションを追加します。[expression]ボックスに 「$gui」と入力します。
     

     
  2. ViewerでNuke GUI上でこちらを再生すると、MotionBlurノード処理をバイパスし、ブラーの効果は表示されません。
     

     
  3. レンダリングの結果は上記の Switchノードを使用する方法と同じですが、ブラーの効果を再び有効にするには、エクスプレッションを完全に削除する必要があります。

 

モードに合わせて数字を変更させる方法

モードに合わせて数字を変更させる方法は、 「$gui」演算子のエクスプレッションを2つの他の値と組み合わせて使用します。有効または無効の値の結果のみを並べるようにして、NUKEがどちらのモードか(GUIまたはGUIでない状態でのレンダリングのいずれか)に応じて、パラメータに適用できる2つの独立した数値を設定することが可能です。

エクスプレッション内容は次のようになります。

$gui?0:20

「0」はNUKEのGUIモードで使用する値であり、「20」はレンダリング中にGUIモード外で使用する値です。

  1. ノード(この例ではMotionBlurノードを使用しています)に 、「$gui?0:20」というエクスプレッションを追加し、エクスプレッションを [Shutter Samples]に割り当てます。 これはGUI上で 「0」サンプルを、レンダリング中に 「20」サンプルの結果を返します。
     

     
  2. これをGUIを通して再生すると、MotionBlurノードにアクセスしていることがわかりますが、GUIモードの外部で「Render in Background」によってレンダリングされ、20のサンプルを使用する時まで、値は0のままです。
     

     
  3. レンダリングの結果は上記の Switchノードを使用する方法と同じになります。

 

 

▼制限

このテクニックにはいくつかの制限があります。

  1. GUIを使用せずにレンダリングする必要があります。つまり、[Render in Background]を使用する、または(NUKE11以降の)「Frame Server」を介してレンダリングする必要があります。
  2. 無効化する方法および選択的に変異させる方法を使用すると、GUIでノード処理結果を表示するためには、エクスプレッションを削除する必要があります。これらの方法はノードの効果を完全にバイパスします。

 

サンプルファイルは、こちらのページの最下部よりダウンロード頂けます。

 

 

※参考リンク