どうも篠島です。今回は多くの人が疑問に思っているであろう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のフレームレンジで正しく処理する方法
- 各ROP の Valid Frame Range パラメーターを Render Frame Range Only (Strict) に変更することで正しいレンジで処理することが可能です。
- もしくは、縦繋ぎで紹介したように Batch ROP を使うと各ROPのレンジで処理されます。
PrePost ROP
他の繋ぎ方として PrePost ROP を使う方法もあります。これは真ん中のノードが Main で、左側のインプットがPre、右側のインプットがPostで、Pre, Main, Post の順番にレンダリングされます。これでノード毎のレンジで処理できるのですが、各ROPのフレームレンジ以外にも、PrePost ROP は Pre と Post のフレームレンジを Main の最初のフレーム、Main の最後のフレーム、Mainと同じフレームレンジから選んでレンダリングをすることができます。ちなみにMainに繋がれたROPは、指定されたフレームレンジ全てが処理されます。