Houdini – ZDepth Passes

ZDepthパスの作成

・Image Planeを作成

MantraノードにてZDepthパス用のimage Planeを作成。

Mantraノード -> Propertiesタブ -> Outputタブ -> Extra Image Planes

+ボタンでイメージプレーンを追加し、VEX VariableパラメータでPzを指定。
Quantizeは最も高精度な32bit Floatにしておくのがいい。

以降のレンダリングで、同時にZDepthパスがレンダリングされるようになる。

20140510_01_1

ZDepthパスの確認

MPlayやRender Viewで、表示するパスを切り替える。

20140510_01_2
Render View

20140510_01_3
MPlay

20140510_01_4

ZDepthパスの最適化

アンチエイリアスがかかった画像に対するZDepthパスイメージは、カラーパスイメージと同様にアンチエイリアスがかかっているため、正しくない深度情報になっている。

また、Depthパスのアンチエイリアス処理は、コンポジットの段階で処理するのが最も柔軟に扱えるので、ZDepthパスだけアンチエイリアスをオフにしてレンダリングする。

・Image Planeの設定

Sample Filter=Closest Surface
Pixel Filter=Closest Sample Filtering

この設定でアンチエイリアスがオフになるはずだが、ならない・・・とりあえずこのまま進める。

ZDepthパスをimgコンテキストで利用

・大枠のimgコンテキストでの作業フロー

fileノードを使用してファイルを読み込み、必要に応じて各種ノードを接続し、画像合成を進める。

使用するビューは Composite View

Composite Viewも、Render ViewやMPlayと同様の操作で表示チャンネルの切り替えなどが行える。

・imgコンテキストのノード

imgコンテキストのノードは、上に入力コネクタ、下に出力コネクタ、左にマスク入力コネクタを持つ

マスクはその他のコンポジットソフトのように、エフェクトの強さを操作するといった場合に使える。

・ZDepthパスの使用準備

画像読み込み
20140510_01_5

深度情報を使用する処理を行う際は、まずDepth of Field(DOF)ノードを作成し、以降の処理で使うマスク画像を生成する。

20140510_01_6

マスク画像はチャンネル名[M]になる。

20140510_01_7

このマスク画像は、DOFノードを有効化し、Mチャンネルを表示して確認できる。
Mチャンネルを表示しながら焦点の設定を行うと作業しやすい。

・Focus Distance パラメータ

焦点距離

カメラからの各サンプリングポイントへの距離は、そのままZDepthパスのピクセルに焼きこまれる。

焦点をあわせるポイントのおおよその距離を知りたいときは、Pzチャンネル表示中にIキーを押して各ピクセルの情報を見られるようにし、焦点を合わせたいピクセルの深度を調べる。

20140510_01_8

この例では、8.2239がそのピクセルが持つ深度の値。

・Depth Adjust

焦点の合う幅。

・Distance Adjustment

焦点距離と焦点のドロップオフを調整できる。(挙動を見る限り、焦点距離がわかりにくくなりそうなので、極力使いたくない)

・Default Mask Value

ZDepth情報を持たないピクセルが持つ値を指定。

Fake DOF

Depth Of Fieldから出力されるマスク画像を、DefocusノードのMaskに入力することでDOFエフェクトをかけられる。

その際、DefocusノードのMaskタブで、マスクに使用するチャンネルをMに指定して、入力されたMaskチャンネルを有効化する。

・Defocus

ぼかしの強さ

・Defocus Shape

シャッター形状

・Per-Pixel Defocus

どう動作しているか不明だけど、これがオンになっていないと、画像にかかるブラーがただのブラーになっており、レンズボケというよりは画像をにじませただけの状態になる。

↓Per-Pixel Defocus オフ
20140510_01_10

↓Per-Pixel Defocus オン
20140510_01_9

Fog

Defocusと同様にFogノードを使用してフォグを追加できる。

Houdini – Mantra Micropolygon Rendering

公式のレンダリング解説

http://sidefx.jp/doc/rendering/

Mantraノードリファレンス

http://sidefx.jp/doc/props/mantra.html

マイクロポリゴンレンダリングの流れ

書籍「Advanced Renderman」6 Photorealistic Rendermanの項が詳しい解説を行っている。

マイクロポリゴンの良い解説があった
http://www.ousam.com/blog/2010/05/03/617

SideFXの解説
http://sidefx.jp/doc/rendering/understanding.html

レンダリング時の流れは以下のとおり

・Split Process

Bucketと呼ばれるサイズにオブジェクトを分割。
デフォルトでは、16×16ピクセルのグリッドで分割が行われる。

・Dice Process

Split後、各Bucketが画面に含まれるか判定後、各ポリゴンを1ピクセルに収まるサイズまで再分割する。
どのようなタイプのGeometryからでも、最終的に1ピクセルに収まる4頂点のポリゴンが生成される。

・Displacement Shader

頂点移動

・Surface Shader

シェーディングが行われピクセルカラーが決定する

サンプリングコントロール

Mantraは、3つのサンプリングコントロールをもつ

・Pixel Sample(Mantraノード内)

1ピクセルに含まれる各マイクロポリゴンの数。
要はアンチエイリアスのサンプル数と捉えて良さそう。
多くすると、よりスムースな結果が得られる。

↓サンプリング数 1 1
20140510_02_0

↓サンプリング数 3 3
20140510_02_1

・Dicing(Geometryノード内)

Geometryノード -> Renderタブ ー> Dicingタブ -> Shading Quality
ピクセルに含めるマイクロポリゴン数。オブジェクトごとに設定できる二次的なサンプリングコントロール。
オーバーサンプリングのための設定と言えそう。
本質的には、1ピクセルに含まれるマイクロポリゴンに対して呼ばれるシェーダ処理の回数。

・Ray Sampling(Mantraノード内)

リフレクション計算のサンプリング数

Houdini – CHOP

https://vimeo.com/7488503

時間差キーフレーム

このチュートリアルでは、カーブが持つポイントに対し元のオブジェクトが持つキーフレームを時間差で写しこむ。

ベースになるキーフレームを作る

動きのテンプレートとなるキーウを作成する。
適当なオブジェクトを一つ作り、通常通りキーを打つ

20140510_03_5

配置先を作る

カーブでもパーティクルでもいいので、Copyでオブジェクトを散布できるようにしておく

20140510_03_6

素のモーションを受け取るAttributeを作成する

キーフレームを時間差コピーする先のオブジェクト内に、Attrib Createでモーションを直接ch関数を使って受け取るAttributeを作っておく。

この例では、以下の様なAttributeを作った

20140510_03_4

Value
ch( “/obj/base_object/tx” )
ch( “/obj/base_object/ty” )
ch( “/obj/base_object/tz” )

Pointノードを作る

直後にPointノードを作成しコネクト。
このポイントのデフォルト値に対して、ベースになるキーフレームをchコマンドを使って足し合わせる。
値を加算しないと、あくまでもキーフレームはローカルの値でしかないため、原点で動くことになる。

20140510_03_7

Position
$TX + ch( “/obj/base_object/tx” )
$TX + ch( “/obj/base_object/ty” )
$TX + ch( “/obj/base_object/tz” )

CHOPに移動値を出力するためのnullを作成

20140510_03_3

TO_CHOPから出力を行う

CHOP Networkを作成

20140510_03_9

20140510_03_8

CHOP Network内でGeometryノードを作成

CHOP Network内に Geometryを作成。
設定は以下のように行う

SOPでキーフレームを含むノードパスを指定
MethodはAnimatedにする(動いているので)
Attribute ScopeでおやAttribute名を入れる?
Rename Scopeで子Attribute名を入れる?

正しくキーフレームが読み込めれば、ノード中ボタンクリックなどで見られる情報ポップアップウインドウで、tx0,tx1…という形式で表示され、各アトリビュートの値が配列で取得できた事がわかる。

20140510_03_0

※ここでの表示数は制限があるので、すべてのキーフレームが表示されるわけではない。

Reorderノードを作成

MethodをNumeric Suffix Sortにする

情報ポップアップウインドウを見ると、Attributeの並びが変わったことがわかる。

20140510_03_1

Motion View

キーフレームなどを設定するためではなく、ただモーショングラフを見て解析するためのビューのようだ

20140510_03_2

Shiftノードを作成する

Shiftノードは、入力されているモーションのチャンネル全体のタイミングをそのままずらす事ができる。

・Scroll Offset

Expressionを仕込むことで、チャンネルごとにずらすことができる。
チャンネルを表すローカル変数は $C

floor( $C / 3 ) * 0.1

3は、1組のチャンネル数

Delayノード

Delayノードは、アニメーションのタイミングを遅延させる。
このチュートリアルで登場したけど最終的には使わなかった。

Channel ノードをGeometry内に作る

CHOPに、さっき作ったCHOP Network内のCHOP_OUTノードへのパスを入力。

・Method

Animatedにする

・Channel Scope

t[xyz] という書式で入力

・Attribute Scope

P

20140510_03_11

各Channelのタイミングをランダマイズする

CHOP_OUTの前にStretchノードを挿入

・Length Scale

rand関数を使ったExpressionを仕込む

rand( $C )

20140510_03_10