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

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

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

Houdini – Shading & Lighting

https://vimeo.com/7612942 – Houdini10以前対応

よく見たら、上記チュートリアルのリンクはHoudini10以前バージョン対応らしい。なので、流し見程度にしておき、Houdini11以降用のチュートリアルで改めて学習する。

https://vimeo.com/14092187 – Houdini11以降対応

シェーダープログラミングは経験したことがない。
そもそも、レンダリングの仕組み自体中途半端にしか理解していない。

HoudiniではVOPでシェーダを一から組み立てられるので一からシェーダ言語を学習するより簡単なはず。

ちょうどいい機会だし、Houdiniとともにかなり基本的なところから勉強してみようとおもう。

VOPノードの操作について

20140506_01_16

左から順に、Debug/ByPass/Display Mode
マニュアル

  • Debug
    Debug Modeをオンにして、出力プラグ上でAlt+右クリックすると、以下のポップアップメニューが表示され、Execute/PopeThrough/Constantが選べる。Execute:通常通り処理させる
    Pipethrough:入力値をそのまま次のノードに渡す
    Constant:指定した値を定数として次のノードに渡す。20140506_01_17

    Execute以外を選ぶと、どのような値を出力するか指定するためのダイアログが開く。
    20140506_01_18

    このダイアログの中では、任意の値を入力できる。
    また、どの入力値をスルーして出力に回すか指定することもできる。

  • ByPass
    入力値をそのままスルーして次のノードに渡す。
    ただし、すべての入出力の型が一致するわけではないため、Debugモードと同じようにAlt+右クリックで出力される値の方などを設定する必要がある。
  • Display Mode
    押すたびに表示するパラメータの数を変更できる。

・インプットコネクタのCollapse

各コネクタを中ボタンクリックし、Collapse Input Connectorを選択すると、コネクタリスト最下部のMoreの中に集約することができる。

・インプットコネクションのHide

コネクタ中クリックから Hide Input Nodesを選択すると、インプットコネクションをまとめて非表示にできる。

20140506_01_19

マテリアルとシェーダ

・マテリアル

シェーダネットワークの入れ物。
広義ではマテリアルもシェーダと呼ばれたりする。

・シェーダ

物体の見た目を決めるための計算方法を定義するもの。
シェーダにはいくつかの種類がある

  • 頂点シェーダ
    レンダリングされるオブジェクトの形状(頂点の位置)を決定するためのシェーダ。
    多分、VOP上では直接触らないものだと思う。
  • サーフェスシェーダ
    ライトに絡む計算を行うシェーダ
    Lighting ModelやSurface Modelノードがこれを担当
    ピクセルシェーダ処理で使われる。
  • ピクセルシェーダ
    レンダリングの最後に、各ピクセルを生成するためのシェーダ。

マテリアルの作成

・Network View

TABキーからマテリアルノードを作成

・Material Palette

Material Paletteで、作成したいマテリアルを左のツリービューから、右のマテリアルリストへドラッグして作成する。

かなりザックリとレンダリングパイプライン

  1. 頂点シェーダ
    3Dオブジェクトを構成する拡張点を、レンダリング画像のどこに配置するかを決定する。
  2. ラスタライズ
    頂点シェーダによって平面に落とし込まれた3Dオブジェクトを各ピクセルに割り当てる。
  3. ピクセルシェーダ
    ラスタライズされた各ピクセルに対し、持たせるColorやAlpha、Depthなどの各チャンネル情報を計算する。

Global Variables VOP

20140506_01_0

※画像はチュートリアルから拝借、問題あれば消します

それぞれのパラメータは、各ピクセルに割り当てられたオブジェクト表面などの位置毎にサンプリングされる。

I:カメラからの視線ベクトル
L:ライトからの光線ベクトル
N:法線ベクトル
P:面上のパラメータ位置
dPds:面上のs方向のある一点?
dPdt:面上のt方向のある一点

Global Variablesノードは、VEXで処理を行うためのすべての入力値を持っている。
この入力値は、内部で設定するContext Typeにより変化する。

Global Variablesノードは、ひとつのマテリアル中にいくつでも含めることができる。

Surface TypeのGlobal VariablesノードのAttribute

Input Attributes

・Context Type

このシェーダノードが行う処理対象(コンテキスト)を指定する。Surface/Fog/Light/Displacement。

・Output a Single Variable / Variable Name

指定された変数のみを出力する。
複数のコンテキストから、必要な変数のみを入力して処理したい場合、不要な変数の表示は視認性を損なうので、このオプションを使うとよい。

Variavle Nameプルダウンメニューは、表示したいAttributeを選択するのに使う。

Output Attributes

よくわからない変数は未訳
※画像はRender Viewのキャプチャ。カラーのレンジはAdaptして見やすくしてある。
20140506_01_25

・Cf

サンプリングされた場所のカラー値

・Of

サンプリングされた場所の不透明度

・Af

サンプリングされた場所のアルファ値

・P

サンプリングされた場所のポジション。

20140506_01_2

↑PパラメータをSurface Colorにアサインしてレンダリング

・Pz

サーフェスのポイントが持つZ深度

20140506_01_3

↑PzパラメータをSurface Colorにアサインしてレンダリング

・I

カメラからの視線ベクトル

20140506_01_4

↑IパラメータをSurface Colorにアサインしてレンダリング

・dPds/dPdt

現時点ではよくわからないパラメータ。要調査

20140506_01_5
↑dPdsパラメータをSurface Colorにアサインしてレンダリング

20140506_01_6
↑dPdtパラメータをSurface Colorにアサインしてレンダリング

・N

カメラの視線ベクトルに対する各サンプリング点上の法線の法線ベクトル

20140506_01_7
↑NパラメータをSurface Colorにアサインしてレンダリング

・Ng

各面が持っている、ジオメトリ上の法線。
この法線はカメラに左右されない。

20140506_01_8
↑NgパラメータをSurface Colorにアサインしてレンダリング

・Eye

カメラの位置

・s/t

各フェース上のパラメータ空間座標。
20140506_01_1
↑sパラメータをSurface Colorにアサインしてレンダリング

20140506_01_12
↑tパラメータをSurface Colorにアサインしてレンダリング

・Time

Shading Time.
まだよくわからない、要調査

20140506_01_9
↑TimeパラメータをSurface Colorにアサインしてレンダリング

・dPdz

Change in Position with depth.
まだよくわからない。要調査

・SID

Sample Identifier. A sample id to be used with the nextsample() VEX function to generate consistent random samples that don’t change when re-rendering or between frames.
まだよくわからない。要調査

Output Variables and Parameters

Global Variablesノードが入力ノードであるのに対し、このノードは処理結果の出力を行う。

Global VariablesもOutput Variables and ParametersもContext Type属性を持っており、受け取りたい変数のタイプや、計算したい内容のタイプに応じてそれぞれセットする。

Textureの作成

・Textureノードを作成

とりあえず、Mandril.picがデフォルトでアサインされてるのでそのまま使う。

Materialをオブジェクトへアサインする

・Materialのパスを指定する

GeometryノードのMaterialタブから任意のマテリアルパスをセットする。

・シェーダをオブジェクトに直接ドラッグ

マテリアルノードをビュー内オブジェクトに直接ドラッグ

UVを有効にする

Textureノードをそのまま接続しただけでは、そのテクスチャを持つMaterialをアサインするオブジェクトがUV作成済みだったとしても、各面が持つP(s,t)を基準にテクスチャが貼られてしまう。

20140506_01_10
↑正しくUVが有効になっていない場合、各面にフィットするようにテクスチャが貼られる

正しくUVを有効にするために、UV Coordsノードを作成し、テクスチャノードのs,tにコネクトする。

20140506_01_11
↑PolerでプロジェクションしたあとでUV Coordを接続し、UVを有効化した

各パラメータ

・uv

uvwをまとめたベクトル

・u

定義済みのUVがあれば、マッピング時に参照する。
UVがなければ各面のsパラメータが使われる。

・v

定義済みのUVがあれば、マッピング時に参照する。
UVがなければ各面のtパラメータが使われる。

Mantra Surface マテリアル

Mantraでレンダリングする場合の標準マテリアル。
実態は、Material Surface Builderノードで、基本的なネットワークが構築済み。

テクスチャを貼る場合は、各マップの項目で、Use○○Mapをオンにしてテクスチャファイルパスを指定。

・Displacementタブ

  • True Displacement
    実際にオブジェクトを変形する。
・Refraction
屈折はオブジェクトの法線方向を間違えると正しく計算されない。法線に対向する方向から見る必要がある。・Caustics
Causticsは、Opacityタブから使用できる。

Environment Light

HDRイメージなどを使用して環境ライトを作成する際に使う

・Renderingタブ Rendering Mode

ライトのサンプリング方法を指定する。

  • Direct Lighting
    背景ライトオブジェクトは、実際のライトとして動作する。
    20140506_01_13
  • Ambient Occlusion
    20140506_01_14
  • Ray Tracing Background
    背景ライトオブジェクトは実際のライトとしてではなく、光を放出するオブジェクトとして扱われる。
    20140506_01_15

Surface Modelノード

以前は、表面の反射などをLighting modelノードで行っていたらしい。
このノードはそれを置き換えるために作られた高機能な万能シェーダらしい。

ライティングへの影響を含む物理的な性質をシミュレートすることができる。

物理ベースのレンダリングを行いたい場合は必須になると思う。

Output Collectノード

マテリアル内に作成された各種シェーダ情報を集約し、出力を行う。

プロシージャルテクスチャ

ノード作成メニューのPatternから、各種プロシージャルテクスチャノードが作成できる。

Promoteされたパラメータをまとめると便利

Promoteされたパラメータは、グループを作って管理したくなるので、Edit Parameter Interfaceを使って任意の位置にフォルダ(タブ)を作成し、まとめておくと管理しやすくなる。

20140506_01_20

レンダリング時に自動でSubdivideする

各Geometryノード内の以下のオプションを有効にする

20140506_01_21

Emissiveなオブジェクト

自ら光を放つオブジェクトはEmissiveなオブジェクトである。

・Emissionを有効にする

Mantra Surface マテリアル設定で、Emissionをオンにする。
同時に、Emission IntensityやEmission Colorなども調整する。

20140506_01_22

Light Linker View

Light Linkerを使えば、ライトとオブジェクトの関係性を定義できる。例えば、特定のオブジェクトのみ照らしたり、特定のオブジェクトのみ影を落とすなど。

20140506_01_23

操作できるのは以下の項目

20140506_01_24

左のペーンでライトを選び、右のペーンで関係をもたせるアイテムのみハイライトする。

・Light Mask
そのライトが照らすオブジェクトを指定する

・Shadow Mask
そのライトを受けて影を落とすオブジェクトを指定する

・Refrection Mask
あるオブジェクトが別のあるオブジェクトにリフレクション要素として映り込むかを指定する。

カスタムシェーダ作成の概要

Material Shader Builderの作成から始めると良い。

必要に応じて Global VariablesOutput Variables and Parametersノードを作成し、必要な出力を作るためのノードネットワークを形成する。

Houdini Surface Shader – VOP Basic

シェーダはSHOPコンテキスト内で操作する

20140505_01_2

シェーダの作成

・Material Palette

20140505_01_0

左側のプリセットを右側のブロックにドラッグして簡単作成

・Network View

TABキーからシェーダーノード名を指定。
Houdiniのバージョンアップに伴い、デフォルトのシェーダ名が変更されているケースが散見される。
最も基本的なシェーダは Material Shader Builder で良さそう。

VOPの基本

20140505_01_1

シェーダアイコンをダブルクリックするとシェーダーを定義しているノードネットワークに入れる。

VOPノード

VOP内のノード表示はこんな感じ

20140505_01_3

ノードの左右端にはノードのコネクト用プラグが並ぶ。

・パラメータ名

フルネームが表示したければPreferenceのNetwork Editorオプションから設定

20140505_01_4

・Nodeコネクション

プラグクリックでコネクタを伸ばし始め、コネクト先プラグをクリックで接続
肩は色分けされているので、ひと目で分かる。

違う型のAttributeを接続する場合は間に「Float To Vector」などの変換ノードを挟む。

基本的な使い方

各種ノードを作成し、それぞれの出力をAdd VOPなどのオペレーターを使用して計算し、最終的にoutputノードへ接続して結果を出力する。

ノードの自動作成

各種入力プラグを中ボタンでクリックすると、よく使うノード(場合によっては小さなノードネットワーク)を自動作成できるようだ。

20140505_01_8

特徴的なのはPromote Parameterで、Parameterノードが接続されたパラメータは、親のShaderノード内にExposeされ、VOPネットワークに入らなくても触れるようになる。

各種ノード

・Parameter

外から値を入力する窓口となるノード。
Parameterノードを作ると、親ノードの中にParameterノードと同じ設定のパラメータが作成される。
親ノード側のパラメータを操作することで、VEX内のノードに与えるパラメータを直接操作できるようになる。

ExportをAlwaysに設定すると、他のコンテキストからこのパラメータを参照できるようになる。
また、こうすることで、VEXネットワーク内で入力パラメータも持つようになる。

・Constant

定数ノード。Typeを指定して様々な型の定数を出力できる。

任意のプラグを中クリックし、ポップアップメニューからConstantを選択することで、そのプラグに接続された状態でConstantノードが作成できる。

・Add/Sub/Multiply/Divideなど

一般的な計算ノード

型の違うパラメータ同士を計算する際は、入力の順番に気をつける必要がある。

20140505_01_5

multiply1はvector型を先に受け取ったので、出力もVector型(ベクトル積)
multiply2はfloat型を先に受け取ったので、出力はfloat型(スカラー積)

※実際に値を表示する方法がわからないのでどのような計算結果が返るかは現時点では不明

・Random

名前の通りの動作。
入出力のタイプをノード内で決定できる。

20140505_01_6

※VOPノードはこのように、ノード内で入出力タイプを切り替えられる場合が多いようだ。

・Lighting Model

シェーダへのライトの影響タイプを定義するノード。Lanbertian/Blinn/Phongなど、古典的なLighting Modelを選択できる。

Lighting ModelパラメータでVEX Specularを選択することで、独自の光沢を作成することができる。

VEXのデータ型

Constantで作れるデータ型は以下のような感じ

20140505_01_7

3Floats/Vector/Colorや、int/toggleなどのように、似ているデータ型が複数存在する。
カッコの中に型名が記載されているので、この型が合っているプラグ同士であれば接続できる。