VEXVEX言語リファレンスVEXの構文、データタイプなどの詳細を説明します。オブジェクトのサーフェスカラーを制御するシェーダはsurfaceコンテキスト用に記述します。ライトからの輝度を決めるシェーダはlightコンテキスト用に記述します。チャンネルデータを作成またはフィルタリングするVEXプログラムは、chopコンテキスト用に記述します。コンテキストが変われば、利用可能な関数、ステートメント、グローバル変数も変わります。VEXを使用できるコンテキストの概要は、VEXコンテキストを参照してください。シェーディングコンテキスト(surface、displacement、lightなど)用に記述する場合、シェーディングコンテキスト固有の情報も読んでください。ステートメントVEXはC言語と同様の通常のステートメントをサポートしています。特定のコンテキスト内でのみ利用可能なilluminanceとgatherのループなどのシェーディング固有のステートメントもサポートしています。組み込み関数VEXには、組み込み関数のライブラリが豊富にあります。いくつかの関数は、特定のコンテキスト内でのみ利用可能です。VEX関数を参照してください。戻りのタイプ、関数名、括弧で括った引数のリスト、その後にコードブロックを指定します。同じタイプの引数は、タイプを再度宣言することなくカンマ(,)区切りのリスト内に宣言することができます。他のタイプの引数はセミコロン(;)で区切らなければなりません。オプションのfunctionキーワードを使って関数定義を導入することで、タイプの曖昧さを回避することができます。メモユーザー関数は、参照される前に宣言しなければなりません。関数は、コンパイラで自動的にインラインされます。再帰関数は動作しません。再帰アルゴリズムを書くには、代わりにシェーダコールを使います。ユーザー関数内の修正は、それをコールした関数の変数に影響があります。ユーザー関数の数に制限はありません。関数内に2つ以上のreturnステートメントを記述することができます。グローバル変数にアクセスすることができます(RenderManシェーディング言語と違い、externでグローバル変数を宣言する必要はありません)。グローバル変数にアクセスしないことを推奨します。これは、あなたが作成した関数が1つのコンテキスト(そのグローバル変数が存在するコンテキスト)内でのみしか動作しなくなるからです。代わりに、グローバル変数をパラメータとして関数に渡してください。メイン(コンテキスト)関数VEXプログラムには、戻りのタイプがコンテキストの名前である関数を1つ含めなければなりません。その関数が、Mantraでコールされるプログラムのメイン関数となります。コンパイラはファイル毎に1つのコンテキスト関数を必要とします。この関数には、必要な情報の計算とグローバル変数の修正の作業(組み込み関数またはユーザー定義関数をコールする)をさせるべきです。コンテキスト関数から値を返すreturnステートメントは使わないでください。各コンテキストで利用可能なグローバル変数用に関しては、特定のコンテキストのページを参照してください。コンテキスト関数への引数は、もしあれば、プログラム用のユーザーインターフェースになります。VEXプログラムを参照するシェーディングノードのパラメータがそれです。コンテキスト関数のパラメータと同じ名前のジオメトリアトリビュートが存在すれば、そのアトリビュートは、パラメータの値を上書きします。これによって、ジオメトリ上のアトリビュートをペイントすることでVEXコードを制御することができます。0.5;}Noteコンテキスト関数へのパラメータは、VEXで特別な方法によって扱われます。パラメータと同じ名前のジオメトリアトリビュートを使ってパラメータの値を上書きすることができます。この特別な場合を除いては、パラメータはシェーダのスコープ内では、"const"とみなされるはずです。パラメータの値を修正することは不当です。コンパイラは、これが起きるとエラーを発生します。exportキーワードを使えば、元のジオメトリに対して修正したいパラメータのフラグを立てることができます。ユーザーインターフェースのプラグマHoudiniでこのプラグマから生成したユーザーインターフェースは最小限(基本的には変数名とデータタイプに基づいた汎用テキストフィールド)のインターフェースです。frequencyパラメータなら、ある範囲内のスライダのUIに、clrはカラーピッカーUIとして指定したい場合があります。これらのことがユーザーインターフェースコンパイラのプラグマを使うことで可能です。0.5;}演算子VEXには標準のC言語の演算子をC言語と同じ優先順位で持っています。以下にC言語と違う箇所を説明します。乗算は、2つのベクトルまたはポイント間で定義されます。乗算は、エレメント対エレメントで計算を実行します(内積や外積とは違います。crossとdotを参照してください)。ほとんどの演算子が非スカラーデータタイプ用に定義されています(つまり、ベクトルにマトリックスを乗算すると、ベクトルがマトリックスでトランスフォームします)。2つの異なるタイプを演算子で組み合わせた時の曖昧な状況では、結果は、2番目(右側)の値のタイプになります。整数とベクトルを以下の順番で加算すると、結果はベクトルになります。vectorドット演算子ドット演算子(.)を使えば、vector、matrix、structの個々のコンポーネントを参照することができます。ベクトルでは、コンポーネントの名前が固定されています。vector2の1番目のエレメントを参照します。vectorやvector4の1番目のエレメントを参照します。vector2の2番目のエレメントを参照します。vectorやvector4の2番目のエレメントを参照します。vectorやvector4の3番目のエレメントを参照します。vector4の4番目のエレメントを参照します。u,v/x,y,z/r,g,bの文字の選択は任意です。ベクトルはポイントやカラーのどちらかを保持するわけではないので、どちらの文字でも構いません。マトリックスに関しては、1組の文字を使用することができます。[0][0]エレメントを参照します。[2][2]エレメントを参照します。[3][0]エレメントを参照します。ドット演算子を使用することで、ベクトルのコンポーネントを"かき混ぜる"ことができます。>=)は、その演算子の左側と右側を比較します。この演算子は、string、float、intのタイプだけに対応します。演算結果は、intタイプです。~)はintのタイプのみに対応します。^=RtL変数割当て1,LtR引数の区切り文字オペレータタイプの相互作用floatとintを演算した場合、その結果のタイプは、その演算子の左側のタイプになります。した場合、VEXは、コンポーネント毎に演算が適用された同じサイズのベクトルを返します。した場合、VEXは、大きいサイズのベクトルを返します。この演算はコンポーネント毎に適用されます。1.0}のように充たされます。5.0}これは、想定外の結果を招くことがあります。4番目の要素は1.0として処理されています。5.0}異なるサイズのベクトルを組み合わせる場合、それらのコンポーネントを抜き出して、それぞれのコンポーネントを"手動"で演算させることで、想定内の結果を得ることができます。データタイプWarningVEXは32ビットの整数を使用します。SOPを使ってジオメトリアトリビュートを64ビットに変換した場合、VEXコード内のアトリビュートを操作する時にはVEXは静かに余分なビットを破棄してしまいます。アンダースコアを使用すれば、長い番号を区切ることができます。0.000_000_1vector22つの浮動小数点値。これらの値を使えば、テクスチャ座標(しかし、通常ではHoudiniはベクトルを使用します!)や複素数を表現することができます。{0.3,0.5}vector3つの浮動小数点値。HSV)を表現するために使用することができます。{0.3,0.5,-0.5}vector44つの浮動小数点値。これらの値は、同次座標の位置、アルファ付きのカラー(RGBA)を表現するために使用することができます。{0.3,0.5,-0.5,0.2}array値のリスト。詳細は、配列を参照してください。}struct名前を付けた値の固定セット。詳細は、構造体を参照してください。matrix24個の浮動小数点値。これらの値は2D回転マトリックスを表現します。}matrix39個の浮動小数点値。これらの値は3D回転マトリックスまたは2Dトランスフォーメーションマトリックスを表現します。}matrix16個の浮動小数点値。これらの値は3Dトランスフォーメーションマトリックスを表現します。}string文字列。詳細は、文字列を参照してください。BSDFの情報は、PBRシェーダの記述を参照してください。構造体Houdini12では、struct(構造体)キーワードを使って新しく構造化されたタイプを定義することができます。C+11のメンバー初期化と同様に、構造体定義内でメンバーデータにデフォルト値を割り当てることができます。2つの暗黙コンストラクタ関数が構造体毎に作成されます。1つ目の関数は、構造体内に宣言された初期化引数の順番で、それらの引数を受け取ります。2番目の関数は、引数を受け取りませんが、すべてのメンバーをデフォルト値に設定します。関数を定義することで、コードを整理し、オブジェクト指向プログラミングの制限された形式を可能にすることができます。構造体関数内では、thisを使って構造体インスタンスを参照することができます。構造体関数内では、構造体フィールドを変数であるかのように名前で参照することができます(例えば、basisはthis.basisのショートカットです)。->矢印オペレータを使って構造体インスタンスの構造体関数をコールすることができます(例えば、sampler->sample())。this->method()を使って構造体の他のメソッドをコールすることができるように構造体関数内部に記述します。構造体関数は名前でフィールドを参照することができます。->を使って構造体インスタンスのメソッドをコールします。}}Mantra固有のタイプMantraには、事前定義された構造体タイプがいくつかあり、シェーディング特有の関数で使用します。lightMantraシェーディングコンテキストのみで定義されています。これは、光源のハンドルを表現した構造体です。光源のvm_illumshaderプロパティにバインドされたVEXサーフェスシェーダを呼び出します。1.000000のような行を見ることがあるでしょう。これらのステートメントは、ライトオブジェクトに対してilluminate()メソッドがコールされた時に呼び出されるシェーダを定義しています。materialMantraシェーディングコンテキストのみで定義されています。これは、オブジェクトに割り当てられたマテリアルを表現した不透明度の構造体です。lpeaccumulatorMantraシェーディングコンテキストのみで定義されています。Expressionsのアキュムレータ(累算器)を表現した構造体です。アキュムレータを構築して初期化します。後始末をして破棄します。現行イベントに基づいて内部状態を修正します。空っぽの文字列を渡すと、'any(どのイベントも可)'と想定されます。内部状態をスタックにプッシュします。内部状態をスタックからポップします。move()の"アンドゥー"にはpushstate()を使用します。現行の内部状態が、ユーザーが定義したライトパスエクスプレッションのどれかに合致すると、ゼロ以外の値が返されます。入力カラーを中間バッファに累積させます。オプションの接頭辞を指定することで、LPE画像平面で宣言された接頭辞と比較されます。累積させるには、すべての接頭辞が合致しなければなりません。中間バッファとmultiplierを乗算し、その結果を画像平面に加算します。中間バッファは、variance(偏差)アンチエイリアスを可能にするために存在しています。(例えば、multiplierは1/number_of_samplesです。lpeaccumulatorに割り当てられている整数IDを返します。IDからlpeaccumulatorを返します。getid()と併用することで、シェーダ境界を越えてlpeaccumulatorを渡すことができます。キャスト(型変換)変数の型変換これは、C++やJavaの型変換と同様です。あるタイプの値を他のタイプの値に変換します(例えば、intからfloat)。b;このサンプルでは、コンパイラは整数の割算をします(タイプの計算を参照してください)。(float)b;これで型変換が行なわれます。これにより、コードのパフォーマンス性能が問題になる場合があります。関数のキャスト(型変換)VEXは、引数のタイプだけでなく戻り値のタイプに基づいて関数を割り当てます(C++やJavaのように)。noise関数は異なるパラメータタイプを受け取り、異なるタイプを返すことができます。noiseはfloatまたはvectorのどちらかを返すことができます。noise(vector)のどちらかに割り当てることができます。);これは関数コールのように見えますが、内部で関数コールを明示しているだけで、パフォーマンスのオーバーヘッドがありません。関数のキャスト(型変換)は、関数コールを直接的に指定したタイプの変数に割り当てた時に暗黙的に行なわれます。noise(P);NoteVEXが、あなたがコールしようとしている関数の引数やタイプを決めることができない時、曖昧なエラーとして候補となる関数を出力します。適切な戻り値を選択して、それが選択されるように関数キャスト(型変換)を追加してください。関数のキャスト(型変換)が任意のタイプの変換を生成しない(単にコールする関数を選択するだけ)ので、それを使ったパフォーマンス低下はありません。パフォーマンスの低下を避けるためにできるだけ変数のキャスト(型変換)よりも関数のキャスト(型変換)を使う方が良いです。コメントVEXはC++スタイルのコメントを使用します:1行コメントは頭に//を付けます。自由形式のコメントは、/*で始めて、*/で終えます。whileVEX言語VEX言語リファレンスVEXの構文、データタイプなどの詳細を説明します。VEXコンパイラ(vcc)VEX言語コンパイラvccとそのプリプロセッサとプラグマステートメントの使い方の概要。VEXコンパイラのプラグマシェーダコール次のステップVEXエクスプレッションの使用VEXでジオメトリグループを扱う方法VEXでは、プリミティブ/ポイント/頂点のグループの内容をアトリビュートと同じように読み込むことができます。ジオメトリ関数VEXでPBRシェーダを記述する方法VEXクックブックVEXによるプログラミングのサンプルと提案。ハーフエッジVEXには、エッジを非共有のフェース単位の"ハーフエッジ"として扱う機能があります。ノイズと乱数VOP/VEXを使ったサーフェスまたはパーティクルの作成VOPのStruct(構造体)VEXでアサーション(診断チェック)を使用する方法assert()マクロを使用することで、VEXコードのデバッグ中に情報をプリントすることができます。リファレンスVEXコンテキストVEXプログラムを記述できる異なるコンテキストへガイドします。