ROP DependencyのFrame Rangeについて 1


どうも篠島です。今回は多くの人が疑問に思っているであろうROPを幾つか組み合わせたときのFrame Rangeについて説明します。

 

今回のサンプルファイルです。
ROP_FrameRange.zip

 

A、B、C という3つのROPがあるとします。そしてそれぞれのROPのFrame Rangeが以下の様になっており、レンダリングしたいフレームレンジが以下の表の緑の様になっているとします。

  • ROP A : 1~10
  • ROP B : 5~20
  • ROP C : 1~5

レンダリングする時の設定は以下の設定でレンダリングします。

 

 

縦繋ぎ

各ノードを縦につないだとしましょう。最後のCのROPをレンダリングするとどうなるでしょうか?

結果は、予想に反して最後のROPが指定したレンジで全ての上流ROPが処理されてしまいます。なぜならば、ROP Dependency の基本はフレームに依存し、最後のROPのフレームXはそれぞれの上流ROPのフレームXに依存するという意味だからです。Cでの処理にはBが必要で、Bの処理にはAが必要なので、各ROPのレンジを無視して一番下のROPでのレンジで処理されてしまうわけです。

 

次に、Valid Frame Range パラメーターを Render Frame Range Only (Strict) に変更してしみます。名前からして指定したレンジだけを処理してくれそうですね。各ROPの設定を変更して結果を見てみると・・・、

結果は各ROPのフレームレンジ内で、かつ一番下のROPのレンジ内のフレームだけが処理されるようになります。Render Frame Range Only (Strict)  にすると、ROPは指定されたフレームレンジ以外を処理しなくなります。

 

縦繋ぎで各ROPのフレームレンジで正しく処理する方法

ここでBatch ROPの登場です。各ROPの下にBatch ROPを挿入し、Always Render Input’s Full Frame Range をONにすると、インプットROPのフレームレンジが全て処理されるようになります。

 

Batch ROPにより、一番下のCをレンダリングしても、上流ROPのフレームレンジが保たれるようになりました。

 

横繋ぎ

次に、3つのROPをMerge ROPにより横に繋いだらどうなるでしょうか。

結果は興味深いことに、各ROPの最小~最大のフレームレンジで全ROPが処理されてしまっています。

 

 

横繋ぎで各ROPのフレームレンジで正しく処理する方法

  1. 各ROP の Valid Frame Range パラメーターを Render Frame Range Only (Strict)  に変更することで正しいレンジで処理することが可能です。
  2. もしくは、縦繋ぎで紹介したように Batch ROP を使うと各ROPのレンジで処理されます。

 

 

PrePost ROP

他の繋ぎ方として PrePost ROP を使う方法もあります。これは真ん中のノードが Main で、左側のインプットがPre、右側のインプットがPostで、Pre, Main, Post の順番にレンダリングされます。これでノード毎のレンジで処理できるのですが、各ROPのフレームレンジ以外にも、PrePost ROP は Pre と Post のフレームレンジを Main の最初のフレーム、Main の最後のフレーム、Mainと同じフレームレンジから選んでレンダリングをすることができます。ちなみにMainに繋がれたROPは、指定されたフレームレンジ全てが処理されます。