Houdini17 VOP&VEX(新規・改良編)


 Houdini17.0から追加された新規ノード、VEX関数と、16.5から改良されたノードをそれぞれご紹介しています。

 各ノード/VEX関数はSideFX社のドキュメントにリンクしているため、ノード/VEX関数のタイトルをクリックするとSideFX社のドキュメントにアクセスすることが出来ます。改良されたノードは、画像で比較出来るように16.5と17.0の両方を掲載しています(2018年10月11日 現在)。

 本題に入ります前に、VOPとVEXについて、基本的な部分からご紹介いたします。既にご理解されている方は読み飛ばして頂ければと思います。まず前提として、Houdini17.0には内部で使用できるプログラミング言語が3種類あります。

 ひとつはPythonです。これはHoudini以外でも使われる汎用的なプログラミング言語であり、Houdiniソフトウェア自体もPythonで作成されております。CG業界以外でも広く利用されていることから、活用の幅という意味では今回紹介する中では一番大きい言語です。Houdini内のパラメータの制御から、外部ツールとの連携、新しいツールの作成、パイプラインの構築など、ほぼすべてのソフトウェア的問題にマルチに対応できます。しかし、Pythonは一般的にプログラマやシステムエンジニアが使うことを想定しているので、CG業界のアーティストには少し敷居が高いかもしれません。

 次に紹介するのがHscriptです。こちらはHoudini内のパラメータ制御等、Houdiniの内部でのみ利用できるHoudini独自のプログラミング言語となっております。Houdiniユーザー向けに作られた言語ですので、Pythonより扱いやすいような設計がされています。しかし、Houdiniの内部、それも限定された箇所での利用しかできないこと、最近は後述するVEXの利用がトレンドになりつつあることから、最近の使用率としては減少傾向にあるのではないでしょうか。

 最後にVEXです。VEXは元々Houdiniにおけるシェーダ開発用言語として開発されたもので、C系列の言語がベースとなっております。特徴としては並列計算に特化しており、処理内容によってはPythonより早く、C++と同速程度まで高速に処理を行うことができる言語です。この特徴から、現在ではシェーダ内に留まらず、SOPやDOPにおいても利用するのが一般的という傾向にあります。

 またSOPにおいてはWragngleノードを利用することでジオメトリやアトリビュートをVEXによって操作することが可能です。WrangleノードとはVEXコードを記述できる空間を持ったノードであり、このノード内にVEXコードを記述することで数式を用いてアトリビュートの値を変更したり、新しいアトリビュートを作成したり、指定したポイントやプリミティブを削除したり、様々なことを行うことができます。

 

 また、VOPというものも存在します。これは簡単に説明すればVEXを可視化したもので、VOPネットワーク内でVEXを視覚的にノードを使って構成することができる、というものになります。コードをノードとして表示するラッパーのようなものであり、これによってコード記述の経験がないアーティストでもノードを利用したアプローチで間接的にVEXを記述できるようになっています。

 HoudiniのVOPとVEXの関係性につきましては、基本的にはVEXありきと考えるのが良いでしょう。VEXというプログラミング言語を視覚的にラッパーし、アーティストにわかりやすい形でノード化したものがVOPになります。

 VEXをある程度理解していれば、VOPの機能は全てVEXで記述することは可能ですが、VOPとVEXは必ずしも全ての場合において対となるものではありません。VEXの関数にはVOPノードとしてラッパーされてないものもありますし、逆にVOPノードが単一のVEX関数をラッパーしたものではなく、複数の関数を含む処理をまとめてラッピングしている場合もあります。

 また、全く同じ処理であっても、VEXで簡潔に記述できてもVOPでは煩雑になるものや、逆に、VOPでは処理が整理されて見やすく構成できてもVEXでは複雑になってひと目で理解できなくなるものがあり、どちらで記述するのが望ましいか、というのは一概に判断できません。周りにアーティストの方が多ければVOPの方が推奨されるかもしれませんし、プログラマの方が多ければVEXの方が喜ばれるかもしれません。

 ゆえに、VOPとVEXは適宜使い分けて作業するのが望ましいと言えるでしょう。

Houdini17 VOP新機能概要

Unified Noise VOPの強化

 バージョンアップが行われ、バリュー、シンプレックス、パーリンフローノイズ等の派生する周期的なノイズがサポートされました。

その他新規ノードが実装されました。

 

CVEX Shader Builder VOP node

CVEX Shader Builderは、内部のVOPネットワークに基づいてCVEXシェーダコードを構築します。 内部ノード(子)の入出力はローカル変数を表し、子自身がこれらのローカル変数で動作するコード群(snippets)を提供します。 シェーダビルダは、これらのコード群を一貫性のある有効なシェーダ関数に統合します。CVEX Shaderの具体的な作例につきましてはこちらのページをご参照ください。

Houdini16.5においてはCVEX Shaderノードが存在しましたが、Houdini17.0においてはこれは削除され、新しくCVEX Shader Builderノードとして再構成されました。

Houdini16.5.571
Houdini17.0.352

Generic Shader VOP node

このVOPは一般的なシェーダを作成します。 スペアパラメータをこのノードに追加して、シェーダパラメータを定義することができます。  オプションのパラメータspareデータタグsidefx :: connector_kindは、パラメータに対応するノードの入力または出力が必要かどうかを指定できます。 タグ値は、「なし」、「入力」、「出力」、または「入出力」が設定できます。 タグが定義されていない場合、または値が事前に定義されていない場合、パラメータのデフォルトは 「入力」です。

PBR Non-Metallic VOP node

※Houdini17.0.352現在、ノードが実装されておりません。
  誘電体(非金属)の反射と屈折を計算します。このノードは、反射、屈折またはその両方を計算します。

Surface Distance VOP node

 ポイントとソースポイントグループ間の最短距離を求めます。このオペレータは、与えられたポイントグループ内の最も近いポイントまでの最短距離を見つけ、それが最も近いグループ内のポイントを返します。

Unified Noise 3.0 VOP node

 このノードはVEXで利用可能なすべての種類のノイズを生成できる統合されたノイズ生成インターフェイスとなります。 このノードではNoise Typeパラメータを使用してノイズを設計し、[Output Correction]タブのパラメータを使用して必要な範囲に出力を調整できます。
 Houdini16.5においてはUnified Noise 2.0 VOP nodeノードとなっていましたが、Houdini17.0においては3.0にバージョンアップされました。

Houdini16.5.571 Houdini17.0.352

変更内容としましてはNoise TypeがValueノイズ、Perlinノイズ、Worley/Cellularノイズの3種類に大別されたのと、周期的なノイズを生み出すPeriodicノイズが外部パラメータとして独立し、それぞれのノイズに周期性を与えられるようになりました。また、signatureを外部から入力できるようになりました。

Unified Noise Static VOP node

 Unified Noise VOPのStatic版になります。Houdiniには、Unified Noise VOPとUnified Noise-Static VOPが同梱されています。 「Static」はあらかじめコンパイルされているので、VOPネットワーク内ではより高速です。Staticノードと無印との違いは、Staticノードの場合、パラメータにノイズタイプとフラクタルタイプを設定する必要があることです。(VOP入力を使用して変更することはできません)  

 Houdini16.5においてはUnified Noise-Static 2.0 VOP nodeとなっていましたが、Houdini17.0においては3.0にバージョンアップされました。

Houdini16.5.571 Houdini17.0.352

変更内容につきましては、パラメータはUnified Noise VOPと同様のものとなっております。既に計算済みの結果を返すStaticノードですので、signatureの入力に関しましてはこちらのノードでは対応していません。

 

 

 

Houdini17 VEX新機能概要

・VEXが一部64bitに対応

 全てのVEXが64bitに対応しているわけではありませんが、CHOPにおける一部の小数点演算などの特定の箇所において64bit VEXオプションが存在します。現在はWrangle、SOP、DOPやGeometory VOPでは64bit VEX利用ができませんが、これは実験的なものであり、将来的には64bit VEXの適用範囲は拡張される予定です。

 

・AVXによるVEXのアクセラレーション

 AVX(Advanced Vector Extensions)とはベクトル演算における8つの単精度浮動小数点数(倍精度浮動小数点数)を可能にする最新のx86 CPU命令セットです。AVXによって連続する基本算術演算(四則演算)を同時に処理することができるようになりました。

 従来機能としてHoudini16.5までは、SSE(4 Float)とSSE2(4 intまたは2 double)を使用しており、AVXは特に算術演算を多用するコードにおいて、この従来手法より最大30%の高速化を実現しました。

 一般的に使われるようなVEXコードにおいてはAVXの使用により、5-10%ほどのスピードアップを開発者側で確認しておりますが、コード総量が極端に短かったり、VEXで標準実装されていない関数を呼び出している場合はAVXの効果が十分に発揮できない場合があります。

 

・VEXのパフォーマンス向上

 64bit対応、及びAVXによるアクセラレーション、ノイズシステムの改良等によって総合的に平均30%程度の高速化を実現しました。これは常にこの数字を保証するものではなく、コードの内容によって前後するものとなります。

 

その他、Houdini17においてノードとして追加された機能の一部、及びそれに関連する関数がVEX上でも実装されています。

agentsolvefbik() VEX Function

 エージェントにフルボディIKを適用するソルバ関数です。

attribdataid() VEX Function

 ジオメトリのアトリビュートのIDを取得する関数です。

chop() VEX Function

 特定のサンプルにおいてchop networkの結果を数値として取得する関数です。

chopt() VEX Function

 特定のサンプルにおいて時間のchop networkの結果を数値として取得する関数です。

diagonalizesymmetric() VEX Function

 入力した対称行列を対角化した直交行列として生成を行う関数です。

expandvertexgroup() VEX Function

 ジオメトリファイルの指定されたグループ内の頂点のリストを返す関数です。

getpackedtransform() VEX Function

 パックされたプリミティブのトランスフォームを取得する関数です。

packedtransform() VEX Function

 プリミティブのトランスフォームをパックする関数です。

random_poisson() VEX Function

 パックされたプリミティブのトランスフォームを変更する関数です。

solvefbik() VEX Function

 フルボディIKを適用するソルバ関数です。

surfacedist() VEX Function

 あるポイントから一番近いポイントグループの中にあるポイントの距離を返す関数です。

polyneighbours() VEX Function

 あるポイントからエッジを共有しているポイントの一覧を返す関数です。

uniquevals() VEX Function

 ユニークな文字、あるいは数字の入った配列を返す関数です。