Houdini – Group

オペレータのGroupパラメータ(ターゲットを直接指定)

Houdiniでは、何かしらの処理を行う際、処理を行うノードの中で処理対象を明示的に指定する事ができる。これにより、後から処理対象を変更することが容易になっている。

例えば、Polygonオブジェクトのいくつかの面を選んでからPoly Extrudeなどの処理を実行すると、Poly ExtrudeのGroupパラメータに、処理対象となるPrimitive番号がリストアップされ、そこで挙げられた番号のPrimitiveに処理が行われていることがわかる。

20140518_01_2

20140518_01_0

20140518_01_1

3つのPrimitive選択後に、シェルフからPolyExtrudeを実行した後のPoly Extrudeノード。
Groupパラメータに3つのPrimitive IDが記入されていることがわかる。ここに、新しい番号を記入すると、そのアイテムにも同様の処理が行われる。

ビューポート内でTABキーを押し、直接オペレータを作成した場合も同様に、ターゲットのIDがGroupパラメータへ自動的に記入される。

Network View内でTABキーからオペレータを作成する場合は、Groupパラメータへは自動的に記入されない。

IDを直接指定する場合、上流にトポロジを変更するノードが追加されて各IDが変化した時、予想外のターゲットに処理が行われることになるので注意。

IDの直接指定は極力使うべきではない。

最後のノードで別のターゲットに対し続けざまに処理を行う

例えばPoly Extrudeを行ったあと、別のPrimitiveを選択し、Enterキーを押すと、選択したPrimitiveに対し、Poly Extrudeノードが追加で作成される。

Primitive選択後に Qキーを押しても同様

処理対象の再選択

選択状態を間違えて新しいオペレータを作ってしまった場合は、まず、オペレータを選択後に画面左の選択ボタン右クリックし、Reselect For Current Toolを選択。

20140518_01_3

20140518_01_4

こうすると、一時的にオペレータが無効になり、処理ターゲットを選択するモードに移る。

その後、任意の対象を選び直し、Enterキーを押すことで選び直した対象がGroupパラメータに改めて指定される。

Group SOP

Groupノードは、これまで見てきたような、何らかの処理の対象となるIDリストに対し、任意の名前をつけて、管理を助けるために使う。

それ以外にも、任意のバウンディングボックス内に含まれるIDリストや、任意軸に対して一定角度内の法線を持つPrimitiveリストを自動的に検出してグループに取り込むなど、多様な自動グループ作成が行えるので、非常に便利。

Group SOPに格納されたアイテムに処理をするには、以降のオペレータでGroupパラメータに使用したいグループ名を入力する。

Houdini – PBRの基本

Phisically Based Renderingの準備

・Mantraノードを作成

Properties -> Renderタブ -> Redering Engine パラメータを PBR系のものに指定。

ただのPBRはレイトレースを使用するPBR。
Samplingの値など、Micro PolygonのPBRとは、値の扱い方が変わるので注意。

・カメラを作成

レンダリングのため、カメラを作成する。

・ライトを作成

PBRシェーダ

見たところ、Material Paletteに標準で登録されているマテリアルは、ほとんどがMaterial Shader Builderにより作られている。
また、マテリアル内部ではSurface Modelを使用していることが多いので、だいたいPBRにそのまま使用できるようだ。

試しにGlassなどを球体にアサインしてレンダリングすると、それだけでもそこそこにリアルだったりする。

20140518_02_0

部分レンダー

Render Viewで、部分的にレンダリングしたい範囲をShift+ドラッグ

Inspect individual pixel values

Render View内でIキーを押すと、ピクセル解析ツールの有効をオン・オフできる。

20140518_02_1

ValPixel values in 0-1 form.

Raw

Raw pixel values, as they are stored (0-255 for 8 bit values, 0-65535 for 16 bit values, and so on).

HSL

Hue, saturation, and luminance of the pixel.

Pix

Pixel coordinates of the mouse pointer.

uv

UV (0-1) coordinates of the mouse pointer.

LUT

Only displayed if the Inspect LUT option on the Correction tab of the display options window is on. Shows a reverse mapping of the value through the LUT. This is useful for Cineon LUTs, to see the original Cineon numbers.

SpecularとRefrection

見たところ、Houdiniの物理ベースシェーダのパラメータは、ゲーム業界で読んでいるパラメータとは違う名前を使用している場合があるようだ。

・RefrectionとSpeculer

Refrectは反射全般をくくる言葉。この中に、表面の滑らかさや反射率などを決めるSpecularパラメータを含んでいる。

・Specular Intensity

素材そのものの反射の強さ。
メタル系の素材は非常に高く、それ以外は非常に低い値。

・Specular Angle

材質表面の粗さ。
表面が滑らかであるほど低く、ザラザラしているほど高い。

・Specular Anisotropy

異方性反射の方向。
Specular Angleによってぼやける反射光が跳ね返りやすい方向を決める。

PBRでは、これらの質感の特性を現実世界の物体に合わせ、正確な特性値(反射の強さやもともとオブジェクトが持っている色(アルベドカラー、表面の目に見えないレベルの細かな凹凸など)を使用し、現実世界のものの見え方をシミュレートする。

そのためには、シェーダーだけでなく、ライト(カラーや強さを表すルーメン)やカメラの絞り、露光など、レンダリングに関わる全ての要素をPBR向けに最適な設定で使用する必要がある。

明るすぎるピクセルの補正

レンダリングすると集光現象などの結果、非常に高い輝度値を持つピクセルが生成されることがある。

20140518_02_3

これを補正するためには、Color Limitパラメータを使用して各ピクセル内の値の上限値を決める。

20140518_02_2

※やり方が悪いのか、効果が出ない・・・バージョン違いによる差が本当に厄介。チュートリアルで示されたオプションが無かったり、手動で追加しなければいけないはずなのにすでに追加されていたりする。

ノード名もかなり変わっているし、結構辛い。

Houdini – Particle Smoke

Particle制御

・Velocity、Accelerationノードなど

sourceノードの下流にVelocityやAccelerationノードを接続すると、その値が有効になる。
これは、上流でPointノードなどを使用して指定した速度などを上書きする。

・Propertyノード

上記ノードと同じように、Particleのスケール変更や質量を変更するには、Propertyノードを使用する。

Houdini – VEX フロー制御

比較演算子

Compareノードを使用する
input1とinput2をどう比較するか内部で指定。結果はbool値で出力される。

if

If Then Blockノード

内部に、Subnet Inputノードがあり、このノードにIf Then Blockのconditionパラメータに入力された値が渡される。

計算の結果は、Subnet Outputノードの _condition または、任意の値をnextに任意の数の値をコネクトし条件ごとの出力を行うことができる。

20140518_03_0

上図の例では、If Then Blockに入力された値が6より小さい場合は Color(0,0,0) を出力。6以上の場合はColor(1,1,1)を出力する。

Whileループなども、同様に使用できるようだ。

Houdini – Networkノードの使い方考察

Network系ノードの取り扱い

各種チュートリアルを見ていると、objツリーにいきなりPOP NetworkノードなどのNetworkノードを作成して作業を進める例が多いことに気づいた。
しかし、それではノード管理が難しくなりそうに思えた。

そこで、各種コンテキスト内に適したNetworkノードを作成し、必要に応じて別のコンテキストから呼び出すような作り方を試してみることにする。

Network系ノードを使うのはどんな時か?

パーティクルの挙動を一つのノード内で管理する場合などはPOP Networkノードを作成する。

同様に、画像のコンポジットを行うときはImage Networkノードを使用する。

このように、各種コンテキストに特化した処理をパックするために使用する。

共通ルール

各種Network系ノードは、能動的にNetworkノード内からデータを受け取りに行く方法と、受動的に外からデータを受け取る方法があるようだ。

※ただし、Networkのタイプによってはどちらかしか出来ない場合もある。

・能動的にデータを受け取りに行くケース

Network内にデータの入口となるノードを作成し、入力したいノードのパスを指定するパラメータを使用して直接データを受け取る方法

例:SOP Networkの Object Mergeノード

・受動的にデータを受け取るケース

データを受け取りたいNetworkノード外でデータ出力用ノードを作成し、出力先のノードパスを、受け取りたいNetworkノードのものに指定する。

例:POP Networkへの出力 POP Mergeノードと、POP Network内のSourceノード

SOP Network

オブジェクトの変形や参照など、Geometryに対する様々な処理をパックするのに使う。

外部からオブジェクトを受け取る場合は、Object Mergeノードを作成して、Objectパラメータにより受け取りたいオブジェクトのパスを指定する。

受け取ったあとは、通常通り各種ノードによる処理が行える。

POP Network

パーティクルの挙動をパックする。

1 事前にPOP Networkノードをpartコンテキスト内に作成する。

2 POP Mergeノードを作成し、POP PathパラメータでそのPOP Mergeノードから参照したいPOP Networkノードを指定すると、POP Mergeノードは、指定したパスのPOP Networkノードそのもののように動作するようになる。

3 POP Mergeに、いつもPOP Networkノードに接続していたようにオブジェクトなどをコネクトする。

4 指定されたPOP Networkノード内にSourceノードを作成し、Geometry Sourceパラメータを任意のものに指定すると、POP Mergeノードが受け取ったとおりのデータを使用して、POP Networkを使用できる。

CHOP Network

各種チャンネル処理をパックする。

1 CHOP Networkノードを作成する。

2 Channnelノードを作成し、CHOPパラメータに、使用したいCHOP Networkノードのパスを入れる。

3 CHOP Networkノードの中に、GeometryやFetchなどのノードを作成し、各ノードパスを指定するパラメータを使用して任意のノードを入力する。

上記のようなパターンで、実際に処理を行う各種ネットワークノードを孤立させ、任意の場所・タイミングで呼び出すことができるようだ。
VOP Network
VOP Networkは、入力されたデータから、内部に用意されたGlobal Variablesノードのタイプに応じた入力値を使用して処理を行う。
外部から呼び出す際は、VOP SOPノードからVOP Networkのパスを指定する。
例外のネットワーク
SHOP Networkは、マテリアルの作成のみを受け持つので、直接外部からオブジェクトを読み込んで何かするためのノードが用意されていないようだ。

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ノード内)

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