Houdini sidefx official Lesson9 Custom Shaders

VOP SOP

頂点を直接操作するためのノード
オブジェクトの変形などができるようだ

20140426_01_0

フルネームでアトリビュート名を表示する

Edit -> Preferences -> Network Editor, Nodes and Trees

で、以下のオプションをオンにする。

20140426_01_1

20140426_01_2

こんなかんじでフルネーム表示される。

アトリビュートの型

アトリビュート名の左右にあるボックスは、コネクタであり、値の型ごとにカラーが決まっている。このへんは他のDCCツールのノードエディタと同じ概念。

異なる型同士を接続sる場合は、変換ノードを間に挟む。
変換ノードには、Float to Vector等がある。

20140426_01_3

各コネクタの上にカーソルを置いて待つとコネクタの詳細情報がポップアップする

20140426_01_4

20140426_01_5

20140426_01_6

これは、型の確認に使える。

VOP SOPノードのボタン

20140426_01_7

ノードの右側にはボタンが有る。
左から順にデバッグ/バイバス/表示モード切り替え。

デバッグは後に説明がありそう
バイパスはそのノードを一時的に無効化する
表示モードは、全アトリビュート表示、コネクト済みアトリビュートのみ表示、全アトリビュート非表示を切り替えられる。

頂点移動の例

20140426_01_9

Noiseを使用してGridを変形する。

20140426_01_8

ここでやってること


入力されたメッシュであるglobal1が持つ頂点からそれぞれ Position(Vector)を取得し、Noiseノードに渡す。この時、特にグループなどが指定されていなければ、global1には入力されたメッシュ上にある全頂点が含まれる。


Noiseノードの計算結果をDisplacementノードに渡し、移動後の頂点位置を出力する。Displaced Position(Vector)


VOP SOPの計算結果を出力するためのOutputノードに、変形後の頂点位置を渡すことで、変形が完了する。

VOP SOPの使い方考察

見たところ、VOP SOP内ではトポロジの変更を行うノード(smoothやsubdivideなど)が作れないようだ。
よって、VOP SOPはすでにあるメッシュなどに対し、何らかの処理をするためのものだと思う。
トポロジ変更はVOP SOPの上流で完了させておく必要がありそうだ。

シェーダーネットワーク

shopでMaterial Shader Builderを作成

20140426_01_10

このノードの内側に入るとVOP SOPと同じ要領でシェーダーネットワークを編集できるようだ。

20140426_01_11

Global Variablesノード

出力したい内容に応じて使用する入力値が異なるので、Global Variablesノード内のアトリビュートを適宜切り替えて使用する。
VOPノードの動作は、このノードから出力される値をもとに行われるようだ。

Surface Modelノード

一般的なシェーディングノード。
だいたいこれを使っとけば問題ないらしい。
ダブルクリックすると中身を見ることができる。すでに複雑なネットワークが組まれていることがわかる。

既存のシェーダノード内にあるネットワークを編集する

20140426_01_12

ノードのラベル部分を右クリックして表示されるメニューから、Allow Editing of contentsを選択すると、ノード名が赤色になり、内部のノードネットワークが編集可能になる。

大体の流れとしては、Global Variable → 任意のチャンネルごとに見た目調整処理 → Surface Model → Surface Output → Collect の順にノードをコネクトすれば良さげ。

アトリビュートのPromote

Material Shader Builder内に存在する各ノードの中から、任意のパラメータへのエイリアスをMaterial Surface Builderノードへ持たせることができる。

外に出したいプラグを中ボタンクリックし、Promote Parameterを選択

20140426_01_13

こうすると、ノードのパラメータの左側に突起が出現し、Promoteされたことがわかる。

20140426_01_14

また、Material Shader Builderノードのパラメータを確認すると、パラメータが追加されたことがわかる。

20140426_01_15

また、Promoteは、パラメータリストに表示されている各パラメータの右端にあるボタンからも行える。

20140426_01_17

20140426_01_16

ノード内の未コネクトパラメータをまとめて外にだす場合は、ノードラベル右クリックから Create Input Parameters を選択する

Promote済アトリビュートのExpose

Promoteは、実際には、実体アトリビュートとアトリビュートへのエイリアスの間に値を中継するためのノードが挿入されて行われる。
ノードのPromote済みプラグを中ボタンクリックし、Expose Input Node を選ぶことで、中継ノードが表示される。

20140426_01_21

上図はdisplacementnml1のscaleアトリビュートはPromote済みで、それをExposeした様子。

この中継ノードを操作すると、値の範囲やタイプなど、パラメータの振る舞いを変更することができる。

Propertiesノード

任意のパラメータを持たせるためのデフォルトでは何のパラメータも持たないノード。Edit Parameter Interfaceで任意のパラメータを追加して使用する。

MaterialパラメータをGeometryノードに渡す

GeometryのMaterialパラメータ欄右端のプルダウンから以下のメニューを選択すると、geometry内のmaterialタブにシェーダが持っているパラメータのエイリアスがまとめて表示されるようになる。

20140426_01_18

20140426_01_19

この操作により外へ出されたパラメータは、マテリアル本体が共有されていても、値は共有されないようだ。

つまり、ひとつのシェーダを使いまわしてバリエーションを作成することができる。

これが、アトリビュートとチャンネルの違いということなのだろうか?
ちょっとぴんとこないので、あとで調べる。

オブジェクト内に直接シェーダーを埋め込む

オブジェクトの内側で SHOP Networkノードを作成するとオブジェクトに、シェーダーを埋め込むことができるようだ。

その後、GeometryノードのMaterialタブにて使用するシェーダーを選ぶ際、以下のようにオブジェクトツリー内のシェーダーが選択できる。

20140426_01_20

また、この時、Export Relative Path を選択してからマテリアル指定を完了すると、相対パスでマテリアルが指定されるため、Geometry自体が階層を移動してもマテリアルのアサインは保たれる。

Displacementの最適化

Displacementはデフォルトの設定では、欠けが発生するなどして、正しくレンダリングされない(チュートリアル中に理由が詳しく述べられているようだけど、よく聞き取れず)

これを回避するためには、Propertiesノードを作成し、レンダリング用の特別なアトリビュートを作成と、シェーダネットワーク末端のCollectノードへ接続する。

アトリビュートの追加はPropertiesノードで通常通りEdit Parameter Interface

For Renderingタブ → mantra → Shading → Displacement Bound

20140426_01_22

20140426_01_23

20140426_01_24

Displacement Boundの値を上げることで、精度が上がり、正しくレンダリングできるようになる。

20140426_01_25

それで出来た草シェーダ

VEXとVOP考察

VEXは、Vertex Expression?
VOPで作成するノードグラフは、実際にはVEXコードをグラフィカルに表示しているだけのようだ。

また、Material Shader Builderのパラメータを見ると Compilerの項目がある。これが意味するところは、リアルタイムにVEXがコンパイルされ、最適化された状態で常に使用されるということなんじゃないだろうか。

VEXのコードを表示するには

VOPの操作による処理を記述できるノードを右クリックし、View VEX Code を選択する