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ノードを作成し、必要な出力を作るためのノードネットワークを形成する。