https://vimeo.com/7612942 – Houdini10以前対応
よく見たら、上記チュートリアルのリンクはHoudini10以前バージョン対応らしい。なので、流し見程度にしておき、Houdini11以降用のチュートリアルで改めて学習する。
https://vimeo.com/14092187 – Houdini11以降対応
シェーダープログラミングは経験したことがない。
そもそも、レンダリングの仕組み自体中途半端にしか理解していない。
HoudiniではVOPでシェーダを一から組み立てられるので一からシェーダ言語を学習するより簡単なはず。
ちょうどいい機会だし、Houdiniとともにかなり基本的なところから勉強してみようとおもう。
VOPノードの操作について
左から順に、Debug/ByPass/Display Mode
マニュアル
- Debug
Debug Modeをオンにして、出力プラグ上でAlt+右クリックすると、以下のポップアップメニューが表示され、Execute/PopeThrough/Constantが選べる。Execute:通常通り処理させる
Pipethrough:入力値をそのまま次のノードに渡す
Constant:指定した値を定数として次のノードに渡す。Execute以外を選ぶと、どのような値を出力するか指定するためのダイアログが開く。
このダイアログの中では、任意の値を入力できる。
また、どの入力値をスルーして出力に回すか指定することもできる。 - ByPass
入力値をそのままスルーして次のノードに渡す。
ただし、すべての入出力の型が一致するわけではないため、Debugモードと同じようにAlt+右クリックで出力される値の方などを設定する必要がある。 - Display Mode
押すたびに表示するパラメータの数を変更できる。
・インプットコネクタのCollapse
各コネクタを中ボタンクリックし、Collapse Input Connectorを選択すると、コネクタリスト最下部のMoreの中に集約することができる。
・インプットコネクションのHide
コネクタ中クリックから Hide Input Nodesを選択すると、インプットコネクションをまとめて非表示にできる。
マテリアルとシェーダ
・マテリアル
シェーダネットワークの入れ物。
広義ではマテリアルもシェーダと呼ばれたりする。
・シェーダ
物体の見た目を決めるための計算方法を定義するもの。
シェーダにはいくつかの種類がある
- 頂点シェーダ
レンダリングされるオブジェクトの形状(頂点の位置)を決定するためのシェーダ。
多分、VOP上では直接触らないものだと思う。 - サーフェスシェーダ
ライトに絡む計算を行うシェーダ
Lighting ModelやSurface Modelノードがこれを担当
ピクセルシェーダ処理で使われる。 - ピクセルシェーダ
レンダリングの最後に、各ピクセルを生成するためのシェーダ。
マテリアルの作成
・Network View
TABキーからマテリアルノードを作成
・Material Palette
Material Paletteで、作成したいマテリアルを左のツリービューから、右のマテリアルリストへドラッグして作成する。
かなりザックリとレンダリングパイプライン
- 頂点シェーダ
3Dオブジェクトを構成する拡張点を、レンダリング画像のどこに配置するかを決定する。 - ラスタライズ
頂点シェーダによって平面に落とし込まれた3Dオブジェクトを各ピクセルに割り当てる。 - ピクセルシェーダ
ラスタライズされた各ピクセルに対し、持たせるColorやAlpha、Depthなどの各チャンネル情報を計算する。
Global Variables VOP
※画像はチュートリアルから拝借、問題あれば消します
それぞれのパラメータは、各ピクセルに割り当てられたオブジェクト表面などの位置毎にサンプリングされる。
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して見やすくしてある。
・Cf
サンプリングされた場所のカラー値
・Of
サンプリングされた場所の不透明度
・Af
サンプリングされた場所のアルファ値
・P
サンプリングされた場所のポジション。
↑PパラメータをSurface Colorにアサインしてレンダリング
・Pz
サーフェスのポイントが持つZ深度
↑PzパラメータをSurface Colorにアサインしてレンダリング
・I
カメラからの視線ベクトル
↑IパラメータをSurface Colorにアサインしてレンダリング
・dPds/dPdt
現時点ではよくわからないパラメータ。要調査
↑dPdsパラメータをSurface Colorにアサインしてレンダリング
↑dPdtパラメータをSurface Colorにアサインしてレンダリング
・N
カメラの視線ベクトルに対する各サンプリング点上の法線の法線ベクトル
↑NパラメータをSurface Colorにアサインしてレンダリング
・Ng
各面が持っている、ジオメトリ上の法線。
この法線はカメラに左右されない。
↑NgパラメータをSurface Colorにアサインしてレンダリング
・Eye
カメラの位置
・s/t
各フェース上のパラメータ空間座標。
↑sパラメータをSurface Colorにアサインしてレンダリング
↑tパラメータをSurface Colorにアサインしてレンダリング
・Time
Shading Time.
まだよくわからない、要調査
↑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)を基準にテクスチャが貼られてしまう。
↑正しくUVが有効になっていない場合、各面にフィットするようにテクスチャが貼られる
正しくUVを有効にするために、UV Coordsノードを作成し、テクスチャノードのs,tにコネクトする。
↑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
実際にオブジェクトを変形する。
屈折はオブジェクトの法線方向を間違えると正しく計算されない。法線に対向する方向から見る必要がある。・Caustics
Causticsは、Opacityタブから使用できる。
Environment Light
HDRイメージなどを使用して環境ライトを作成する際に使う
・Renderingタブ Rendering Mode
ライトのサンプリング方法を指定する。
- Direct Lighting
背景ライトオブジェクトは、実際のライトとして動作する。
- Ambient Occlusion
- Ray Tracing Background
背景ライトオブジェクトは実際のライトとしてではなく、光を放出するオブジェクトとして扱われる。
Surface Modelノード
以前は、表面の反射などをLighting modelノードで行っていたらしい。
このノードはそれを置き換えるために作られた高機能な万能シェーダらしい。
ライティングへの影響を含む物理的な性質をシミュレートすることができる。
物理ベースのレンダリングを行いたい場合は必須になると思う。
Output Collectノード
マテリアル内に作成された各種シェーダ情報を集約し、出力を行う。
プロシージャルテクスチャ
ノード作成メニューのPatternから、各種プロシージャルテクスチャノードが作成できる。
Promoteされたパラメータをまとめると便利
Promoteされたパラメータは、グループを作って管理したくなるので、Edit Parameter Interfaceを使って任意の位置にフォルダ(タブ)を作成し、まとめておくと管理しやすくなる。
レンダリング時に自動でSubdivideする
各Geometryノード内の以下のオプションを有効にする
Emissiveなオブジェクト
自ら光を放つオブジェクトはEmissiveなオブジェクトである。
・Emissionを有効にする
Mantra Surface マテリアル設定で、Emissionをオンにする。
同時に、Emission IntensityやEmission Colorなども調整する。
Light Linker View
Light Linkerを使えば、ライトとオブジェクトの関係性を定義できる。例えば、特定のオブジェクトのみ照らしたり、特定のオブジェクトのみ影を落とすなど。
操作できるのは以下の項目
左のペーンでライトを選び、右のペーンで関係をもたせるアイテムのみハイライトする。
・Light Mask
そのライトが照らすオブジェクトを指定する
・Shadow Mask
そのライトを受けて影を落とすオブジェクトを指定する
・Refrection Mask
あるオブジェクトが別のあるオブジェクトにリフレクション要素として映り込むかを指定する。
カスタムシェーダ作成の概要
Material Shader Builderの作成から始めると良い。
必要に応じて Global VariablesとOutput Variables and Parametersノードを作成し、必要な出力を作るためのノードネットワークを形成する。