« C4D すみません…また「被写界深度」… こだわっている訳ではないのですが… | トップページ | C4D PyroClusterを「取りあえず使う」為のきっかけ… »

C4D シーンモーションブラー処理中のXPressoのC.O.F.F.E.E.ノードでの出来事…

シーンモーションブラー処理中(レンダリング中)に…
予想もしていなかった事が分かりました。
既に知っているかもしれませんが…

シーンモーションブラーでの時間の進み方は、前にも取り上げました。

C4D シーンモーションブラーとタイムライン
http://villager-and-c4d.cocolog-nifty.com/blog/2009/09/c4d-115c.html

シーンモーションブラーの処理は、見た目に判断すると…

1フレームを、シーンモーションブラー設定で指定したサンプル数で細かく刻んで、時間軸を進む…

サンプル数分レンダリングすると、全てのサンプルを合成する…

これの繰り返しだと、普通思うだろう…

フレームもサンプルフレームも、同じ時間軸上で処理をする。
そう、自分は思っていました。
ただ、時間軸を移動する移動量が違うだけと…

どうやら、フレームと、サンプルフレームは、別々に処理されているようです。
ただし、BaseTime->GetSecond()で取得できる時間は、フレームもサンプルフレームも一連ですが…

では、確認作業です。

ヌルオブジェクトを追加しXPressoを取り付けます。

Motionblur_06

C.O.F.F.E.E.ノードを追加し、全てのポートを削除します。

Motionblur_07

C.O.F.F.E.E.ノードの中身は…

/*
test MB
2009.10.23
*/


var test;

main()
{
  if(!test)test = 0;
  test++;
  println(test);
}

このブログを読んでくれている方には、説明するほどでは、ないですね。

でも… 簡単に…

グローバル変数testを宣言し…
もし、グローバル変数testに値が入っていなければ、0で初期化。
要するに、C.O.F.F.E.E.エディタで「コンパイル...」「実行」ボタンが押されたときや、レンダリング開始したときの0フレームでグローバル変数が宣言しなおされたとき、値が何も設定されていない事になる。
その時は、0で初期化する。
main()が実行されるたびにグローバル変数testに1づつ加算され、コンソールにtestの値を表示する。

main()が実行されるとき…
ユーザの操作でイベントが起こった時… 延々と加算され続けます。
アニメーションレンダリングされた時…0で初期化され加算されます。

では、「出力」で終了フレームを適当に3Fへ変更…

Motionblur_05

コンソールを開いてから、この状態のまま、レンダリングしてください。

コンソールには…

1
2
3
4

この様に表示されます。

では、この状態のまま、シーンモーションブラーを設定します。

レンダリング設定の「特殊効果...」で「シーンモーションブラー」を追加しサンプル数:5を設定してください。

Motionblur_04

多分、ここで予想すると…

1
2
3
4
5
:
:
16
17
18
19
20

4フレーム × サンプル5 = カウント20
こんな具合だろうか…

では、同じくレンダリング…

1
1
1
1
1
1
2
1
1
1
1
1
3
1
1
1
1
1
4
1
1
1
1
1

この様な具合になります…
C.O.F.F.E.E.コードに変更はありませんが…

フレームのカウントは別に進み…
サンプルフレームが常に再宣言されている状態のようです。
フレームでのグローバル変数testの値は保持されて加算されていますが…
サンプルフレームでは、グローバル変数testは別に宣言されているようで…サンプルフレーム間で値が保持されていません。

この事から、フレームとサンプルフレームは別に処理されている事が予想されます。
しかも、サンプルフレーム間では、グローバル変数を使って値を保持する事が不可能と言う事になります。

この結果を見ると、main()関数が呼ばれているのは、各フレームでフレームが1回、サンプルフレームが5回、計6回呼ばれています。
フレームは、フレーム。サンプルフレームは、サンプルフレーム。と完全に別物として処理されている事になります。

|

« C4D すみません…また「被写界深度」… こだわっている訳ではないのですが… | トップページ | C4D PyroClusterを「取りあえず使う」為のきっかけ… »