On this page |
概要 ¶
スタイルシートとは ¶
スタイルシートはスタイルのコレクションです。
スタイルには、特定のプリミティブに合致させるターゲット条件、その合致したプリミティブのマテリアルまたはマテリアルパラメータの変更方法の命令が含まれています。
例えば、本質的には“char1
オブジェクトの中, skin
パックプリミティブの中, shirt
グループ内のフェース, Diffuseカラーを青に変更”のようなスタイルを作成することができます。
Note
Mantraは、 レンダリング時 にレンダラーがジオメトリをシェーディングする直前にスタイルシートを適用します。
スタイルシートの目的 ¶
-
スタイルシートとは、パックプリミティブ内のジオメトリを選択できなくてマテリアルが適用できないという制限の回避策です。 その代わりに、マテリアルを設定/変更するためには、スタイルを使ってパックジオメトリを“ターゲット(特定)”しなければなりません。
-
スタイルシートでは、レンダリング時の“実際の”ジオメトリのみをターゲットにすることができます。 スタイルシートは、レンダリング時にマテリアルの変更(スクリプトによる変更/ランダムな変更を含む)をインスタンスジオメトリとエージェントに適用することができます。 これによって、同じジオメトリのインスタンス化にはメリットがありますが、さらにそのインスタンスのルックを別のルックにすることも可能です。
-
スタイルシートは、ジオメトリを編集したりシーン記述ファイル(IFD)を再生成することなくルックを変更することができます。 これは、巨大なシーンを取り扱うスタジオでは役に立ち、スタイルシートによる迅速な調整は巨大なIFDを再生成するよりも高速です。
スタイルシートの場所と優先度 ¶
スタイルシートは異なるレベルで適用することができます:
-
Mantraコマンドラインの
-S
オプションでスタイルシートを指定することができます。 -
スタイルシートをシーンファイル(
.hip
)に保存することができるので、そのファイル内のジオメトリをターゲットにすることができます。 -
Houdiniオブジェクトにスタイルシートパラメータを追加することができるので、オブジェクト内のジオメトリをターゲットにすることができます。
-
material_stylesheet
アトリビュートを使用したプリミティブにスタイルシートを指定することができます。パックプリミティブの場合、その中にあるパックジオメトリをターゲットにすることができます。
各レベルは、より低いレベルのジオメトリをターゲットにすることができます。
2つのレベルが同じジオメトリをターゲットにした場合、 高いレベルのスタイルシートが低いレベルを上書きします 。この順位にはいくつかメリットがあります:
-
パックプリミティブ上のスタイルシートは、その中にあるジオメトリのマテリアル割り当て/マテリアルパラメータを上書きすることができます。
-
コマンドラインによるトップレベルのスタイルシートを指定すれば、レンダリング時に何でも上書きすることができます。 これは、IFDを再生成することなくマテリアルの割り当てやマテリアルパラメータを変更することができるので、巨大なシーンで役に立ちます。
スタイルシート内で 後で リストしたスタイルは、前にリストしたスタイルを上書きします。
ビューポート表示 ¶
ビューポートは、スタイルシートによるジオメトリのマテリアルの割り当てとオーバーライドを表示することができます。 ビューポートのDisplay Optionsのコントロールを使用することで、特定のスタイルシートの機能(オーバーライド、パックプリミティブターゲット)を有効/無効にしたり、完全にスタイルシートの表示を無効にすることができます。
ビューポートでのスタイルシートの表示にはいくつか制限事項があります:
-
スタイルシートがマテリアルの割り当てやGL Tagにタグ付けされているマテリアルパラメータの上書きをしている場合にのみ、その効果がビューポートに表示されます。
-
デフォルトでは、リアルタイム表示を維持するために、単一オブジェクトに対して最大100個までのマテリアルのみをビューポートに表示します。この制限事項は、Display Options の Optimization タブで変更することができます。
-
スタイルシートで“その場に応じて”定義されるマテリアルはビューポートには表示されません。
-
スタイルシートを変更すると、ビューポートが更新されます。とはいえ、そのスタイルシートで参照されている外部スクリプトやCVEXノードの変更をHoudiniは検出しません。その表示を手動で更新するには、(ビューアの右側にある)ディスプレイオプションツールバーの View Materialsボタンを右クリックして、 Update stylesheets を選択します。
(別の方法として、Display Optionsウィンドウの Optimize タブの Update ボタンをクリックすることができます。)
-
現在のところ、パックインスタンス毎にターゲットを変更するスタイルシートに関しては、そのインスタンスが2個以上ある時にターゲットがパックプリミティブ内にある場合は、そのマテリアルの変更をビューポートに表示させることができません。
用語 ¶
Stylesheet
特定の条件に合致したジオメトリ上のマテリアル割り当て/マテリアルパラメータを上書きする方法に関する情報を含みます。 スタイルシートには、 スタイル , 共有マテリアル の定義 , 共有スクリプト , 他のスタイルシートの参照を含めることができます。
Style
ターゲットの指定と、そのターゲットとなるジオメトリに適用する オーバーライド のリストを含みます。
スタイルは、独自のオーバーライドを含むことができたり、複数のスタイルから使用可能な共有オーバーライドのセットを参照することができます。
Override
ターゲットジオメトリに適用する新しいマテリアルの割り当て/マテリアルのパラメータの値。以下のオーバーライドを参照してください。
Scripts
オーバーライド内のCVEXスクリプトを使用して、レンダリング時にマテリアルパラメータの値を計算することができます。以下のスクリプトを参照してください。
Target binding
合致したジオメトリ上のアトリビュートをスクリプトの引数に“バインド(紐付け)”することができます。以下のバインドを参照してください。
ターゲット ¶
スタイルの ターゲット 部分では、スタイルのオーバーライドの適用先となるジオメトリを指定します。
ターゲットは以下の4つのアイテムを含めることができます:
Target type
ルールを適用するジオメトリのタイプ。
Primitive
ジオメトリプリミティブ(例えば、ポリゴン)。
Point instances
ポイント。インスタンスジオメトリに継承されるポイントにマテリアルを適用し、アトリビュートを設定することができます。
Object
キャラクタや小物などのトップレベルオブジェクト。
Context dependent
スタイルシートがオブジェクト上にある場合はオブジェクトをターゲットに、スタイルシートがPrimitiveアトリビュート内にあればプリミティブをターゲットにします。
Conditions
以下の条件を参照してください。
Sub-targets (optional)
ターゲットは再帰的にサブターゲットを含むことができるので、オブジェクト内のオブジェクトやパックプリミティブ内のジオメトリに合致させることができます。
Target bindings (optional)
これは、“targets”部分の合致の結果を“overrides”部分のスクリプト引数にバインドすることができます。
条件 ¶
ターゲットは以下の 条件 を持つことができます。複数の条件を持たせた場合、ターゲットがそれらの条件に すべて 合致しなければなりません。条件がなければ、スタイルはすべてに合致します。
Self name or path
(Target typeが“Context dependent”の時) スタイルシートがオブジェクト上にあれば、この条件はオブジェクトパス条件と同じです。
スタイルシートがプリミティブ上にあれば、この条件はプリミティブ名またはpath
アトリビュート条件と同じです。
Primitive name or path attribute
プリミティブ番号、またはプリミティブのname
やpath
のアトリビュートの値。例えば、/alembicarchive/*book*
。
Object path
オブジェクトの名前またはパスに合致させるパターン。例えば、/obj/subnet1/character1
。
Object category
カテゴリタグでオブジェクトに合致します。
Object bundle
指定したバンドル内のオブジェクトに合致します。
Primitive group
グループ構文で指定したプリミティブに合致します。
Point group
グループ構文で指定したポイントを共有しているプリミティブに合致します。
Vertex group
グループ構文で指定した頂点を共有しているプリミティブに合致します。
Agent shape
name
によるエージェントプリミティブ内の“shape”ジオメトリに合致します。
Multi-level Entity Path
(廃止されました。このオプションを使用した古いスタイルシートを読み込んだ後にのみ利用可能です。)
この条件タイプは、Self nameまたはSelf pathと等価の条件として使用することができます。
さらに、この条件には、スラッシュを使って別々のコンポーネントを指定することで、複数レベルの入れ子状でエンティティを指定することができます。
例えば*book*/45
を指定すると、*book*
に合致したname
またはpath
のアトリビュートを持ったパックジオメトリ内のプリミティブ45を指定することができます。
最後に、1つの条件でオブジェクトとプリミティブの両方のパスを指定するには、オブジェクトとプリミティブの部分をコロンで分けなければなりません。例えば、/obj/geo*:*book*/45
。
この条件タイプは、それによって可能な機能すべてが入れ子状のターゲットを使用することでもっと明確に表現できるので、廃止されました。
オーバーライド ¶
スタイルの オーバーライド には、合致したジオメトリに割り当てられたマテリアルを変更する方法を指定します。 新しいマテリアルを割り当てたり、マテリアルのパラメータ値を変更することができます。 また、静的な値を使用せずに、CVEXスクリプトを指定してオーバーライド値を計算することもできます。
スタイルには色々なタイプのオーバーライドを含めることができます。 各オーバーライドのタイプは、すべてのターゲットのジオメトリに対して定数を使って設定したり、ターゲットのコンポーネント毎に実行してそのコンポーネントの値を計算するCVEXスクリプトで 設定することができます。
Set material
ジオメトリに割り当てられたマテリアルを変更します。
Render property
ジオメトリのレンダープロパティの値を変更します。 レンダープロパティは、ジオメトリのレンダリング方法に影響を与える設定のことであり、サーフェスやディスプレイスメントのシェーダに対するパラメータではありません。 これらの設定は、例えば、ジオメトリをサブディビジョンサーフェスとしてレンダリングするかどうか制御したり、本当のディスプレイスメントマッピングを使用するかどうかを制御します。
Material parameter
ジオメトリのマテリアルのパラメータの値を変更します。このタイプのオーバーライドは、サーフェスとディスプレイスメントのシェーダの両方に影響を与えます。
Surface parameter
ジオメトリのサーフェスシェーダのパラメータの値のみを変更します。
Displacement parameter
ジオメトリのディスプレイスメントシェーダのパラメータの値のみを変更します。
Style Sheet Editorペイン ¶
Data Treeペイン内のツリーエディタを使用して、スタイルシートを編集することができます。 このツリービューには、ファイルに保存されたトップレベルのスタイルシートやオブジェクト上のスタイルシートパラメータの内容を表示します。
JSONファイルと文字列アトリビュートを手動で編集するよりも簡単ではありますが、このEditorペインはJSONフォーマットに対して機能的に弱いインターフェースです。 ツリー内のアイテムは、JSON内のオブジェクトに相当します。何かをツリーに追加するには、ツリー内のアイテムを右クリックして、アイテムのタイプを選択することで、その下に新しいアイテムが追加されます。
To... | Do this |
---|---|
Material Style Sheet Editorペインを作成する |
|
新しいスタイルシートを作成する |
|
オブジェクトにスタイルシートを追加する |
|
スタイルをスタイルシートに追加する |
Editorペインで、ツリー内のスタイルシートを右クリックして、 Add style を選択します。 |
ターゲット指定をスタイルに追加する |
Editorペインで、ツリー内のスタイルを右クリックして、 Add target を選択します。
|
スタイル内のマテリアル割り当てを上書きする |
スタイル内に1個のマテリアルオーバーライドしか持つことができません(その理由は、2回以上もマテリアルを上書きするするのは意味がないからです)。 |
スタイル内のマテリアルパラメータを上書きする |
|
複数のスタイル間で同じオーバーライドを共有する |
まず最初に、複数のスタイルが参照可能な 共有オーバーライトセット を作成します:
そして、スタイル内のその共有オーバーライドセットを参照するには:
同じスタイル内で複数の共有オーバーライドセットを参照することができます。これは、使用頻度の高いオーバーライドを小さいセットに分解して、特定のスタイルで必要なオーバーライドを適用することができます。 |
スタイルシートの順番を変更する |
スタイルシートをツリー内で上下にドラッグします。 |
他のスタイルシートの内容を参照する |
|
Editor内でアイテムを検索する |
Filter フィルターを使用することで、特定のテキストを含んだ行のみを表示させることができます。例えば、指定した名前のマテリアルを割り当てるスタイルを表示させることができます。 |
追加情報を取得する |
スタイル、ターゲット、コンディションのアイテム上でクリックします。 |
スタイルシートをJSONとして取得する |
|
ソロとミュート ¶
スタイルシートを作成/編集している時、レンダリング内のどの効果がどのスタイルから発生しているのかを特定できるように、別のアイテムの効果を制限するのは役に立ちます。
スタイルシートエディタツリー内の“solo”と“mute”のコントロールを使用することで、簡単にスタイルシートとスタイルをオン/オフすることができます。
To... | Do this |
---|---|
単一のスタイルシートまたはスタイルの効果だけを確認する |
スタイルシートまたはスタイルの隣にある Solo列のラジオボタンをクリックします。 |
スタイルシートまたはスタイルの効果を隠す |
スタイルシートまたはスタイルの隣りにある Mute列のチェックボックスをクリックします。 |
CVEXスクリプトの使い方 ¶
スタイルシートはどこにでも新しいマテリアル名や新しいマテリアルパラメータ値を指定することができるので、CVEXスクリプトを使用することで、静的な値を指定する代わりにレンダリング時に新しい値を計算することができます。
CVEXスクリプトは、VEX言語スクリプトです。 CVEXとは“Contextless VEX”の略で、コンテキスト固有の関数(例えば、ジオメトリを制御する関数など)をスクリプトで利用できないことを意味しています。
このスクリプトは、戻りタイプがcvex
の関数を必ず持たなければなりません。
cvex
関数は戻りタイプを持たないので、export
引数を使用してスクリプトの結果を出力しなければなりません。
関数に1個のexport
引数しかなかった場合、Mantraは自動的にその引数を使用します。
関数に2個以上のexport
引数があった場合、JSON内にreturn
キーを使用することで、出力として使用する引数を指定することができます。
Note
CVEX関数の 名前 は問題になりません。Mantraはcvex
戻りタイプを持つ関数だけをコールします。
cvex mySharedFn(int packed_id=0; int unpacked_id=0; export vector c={0,0,0}) { c.r = 0.3 * float(packed_id); c.g = 0.2 * float(unpacked_id); }
Tip
ポイントインスタンスをターゲットにする時、スクリプトで ポイント番号 を使用したいことでしょう。残念ながら、ポイント番号を直接使用することはできません。 ポイントには、CVEXスクリプトでパックジオメトリとバインドした時のような“intrinsics”(計算された擬似アトリビュート)がありません。 回避策として、ポイントに対してポイント番号を含んだアトリビュートを作成することができます。
スタイルシートエディタにスクリプトをセットアップする方法 ¶
To... | Do this |
---|---|
新しいマテリアルを計算するスクリプトアイテムを作成する |
ツリー内で、スタイルを右クリックして、 Add override script を選択します。“Type”列をクリックして、オーバーライドを“Set Material”に変更します。 |
新しいマテリアルパラメータ値を計算するスクリプトアイテムを作成する |
ツリー内で、スタイルを右クリックして、 Add override script を選択します。 |
複数のオーバーライド間で共有するスクリプトアイテムを作成する |
ツリー内で、“Shared scripts”アイテムを右クリックして、 Add shared script を選択します。 “Override type”列内をクリックして、スクリプトの場所を設定します: Inline 1行のVEXコードを“Override value”列に格納します。
これは簡単なテストや非常に短いスクリプトで役に立ちますが、改行が使用できない(もちろん1行に External script file “Override value”列にスクリプトファイルの場所(ファイルパスまたはURL)を入力または選択します。 Script from SHOP VEX SHOPまたはVOP CVEX SHOPを“スクリプト”として選択して、値を生成します。これは、VOPネットワークを構築することで“スクリプト”の挙動を定義することができます。 Attribute binding 単にアトリビュート値(バインドされた名前)に基づいてマテリアルパラメータ値を設定するCVEXコードを生成します。“Override value”列でアトリビュート名/バインドされた名前を入力します。 |
スクリプトのバインド ¶
スクリプトは、合致したジオメトリ上のアトリビュート値をCVEX関数の名前付き引数に“バインド”することができます。
ターゲットにしている階層内の高いターゲットレベルほど、 その レベルでアトリビュート値をバインドすることもできます。 そして、CVEXスクリプトへの引数として利用可能なそれらの バインドされたデータ を作成することができます。
例えば、スタイルがパックプリミティブ1
と2
をターゲットにしていると仮定すると、
サブターゲットは、そのパックプリミティブ内のcolor_prims
グループに合致します。
パラメータオーバーライドスクリプトを使用すると、Mantraはcolor_prims
内のプリミティブ毎に対してスクリプトを実行します。
スクリプトにはパックプリミティブのプリミティブ番号を知らせる必要があります。
それをするために、トップターゲットにintrinsic:indexorder
アトリビュートの値をtop_level_prim
という名前に バインド することができます。
スクリプトがコールされると、Mantraは、そのスクリプトにパックプリミティブ番号を含んだtop_level_prim
引数を渡します。
To... | Do this |
---|---|
スクリプトまたはターゲットにバインドを追加する |
|
Tips ¶
-
Houdiniでプレビューレンダーを作成した時、Houdiniはそこに含まれたスタイルシートの変更を自動的に検出しません。そこに含まれたスタイルシートを変更したら、手動で再レンダリング(例えば、Render View内の Render ボタンをクリックして)する必要があります。
サンプル ¶
Basic style sheets
基本的なスタイルシートの使い方: オーバーライドするマテリアルのプリミティブとオーバーライドする内容を識別する方法。 プリミティブのカラーをランダムにするVEXスクリプトの使い方も説明しています。
Style Sheets for Packed Primitives
パックジオメトリとその入れ子になったパックジオメトリ内のプリミティブにマテリアルを割り当てる方法。
Basic Style Sheets for Crowds
群衆内の各エージェントに色々なテクスチャマップを割り当てる方法。
Style Sheets for Crowd Shapes
群衆エージェントジオメトリを構成する形状内のプリミティブグループにマテリアルを割り当てる方法。
スタイルシートHOMスクリプト ¶
hou.stylesモジュールとhou.StyleSheetオブジェクトは、Pythonでプログラム的にスタイルシートを制御することができます。
スタイルシートJSONフォーマット ¶
スタイルシートは JSONファイル です。 スタイルシートエディタは、JSONを視覚的なツリーとして編集することができますが、手動またはプログラムでJSONを生成することもできます。
JSONの挙動を確認する最も簡単な方法は、スタイルシートエディタであなたが欲しい構造を作成し、ツリー内のスタイルシートを右クリックして、 View JSON を選択することです。
トップレベルのオブジェクトは4つのキーを持ちます: importFiles, scriptDefinitions, materialDefinitions, styles.
サンプル ¶
{ "importFiles" : [ "mss/main_style.json" ], "scriptDefinitions" : { "mss_shared_script" : { "code" : "cvex mySharedFn(int packed_id=0; int unpacked_id=0; export vector c={0,0,0}) { c.r = 0.3 * float(packed_id); c.g = 0.2 * float(unpacked_id); }", "bindings": { "unpacked_id" : "intrinsic:indexorder", "packed_id" : "top_level_prim" } } }, "materialDefinitions" : { "mss_const_mat" : { "properties" : { "surface" : "opdef:/Shop/v_constant clr 0.1 0.1 0.8" } } }, "styles" : [ { "selfTarget" : { "objectName" : "/obj/colored_object" }, "overrides" : { "material" : { "name" : "mss_const_mat" }, "materialParameters" : { "clr" : [ 0.8, 0.1, 0.2 ] } } }, { "target" : { "group" : "1 2", "preBindings" : { "top_level_prim" : "intrinsic:indexorder" }, "subTarget" : { "subTarget" : { "group" : "colored_prims" } } }, "overrides" : { "materialParameters" : { "clr" : { "script" : { "importScript" : "mss_shared_script" } } } } } ] }
インポート ¶
importFiles
トップレベルキーは、スタイルシートの場所(ファイルパスまたはURL)を意味する文字列のリストにマップします。
それらのファイルからのデータは、現行スタイルシートに含まれます。現行ファイル内の共有されるスクリプトとオーバーライドセットは、そこに含まれているスタイルシート内の同じ名前のものを上書きします。
{ "importFiles" : [ "mss/main_style.json", "prim_style.json" ] }
共有スクリプト ¶
scriptDefinitions
トップレベルキーは、共有スクリプト名をスクリプトオブジェクトにマッピングしたオブジェクトにマップします。
{ "scriptDefinitions" : { "mss_shared_script" : { "code" : "cvex mySharedFn(int packed_id=0; int unpacked_id=0; export vector c={0,0,0}) { c.r = 0.3 * float(packed_id); c.g = 0.2 * float(unpacked_id); }", "bindings": { "unpacked_id" : "intrinsic:indexorder", "packed_id" : "top_level_prim" } } } }
マテリアル定義 ¶
理論的には、スタイルシート内にマテリアルを定義することができます。 これにより、自己完結型のスタイルシートを作成することができ、新しいマテリアルを既に生成されたIFDファイルに取り込むことができます。 現実的には、これは、IFDシェーダ文字列を書き出すためのIFDに関する十分な知識が要求されます。
さらに、マテリアルのSurface/Displacementシェーダを定義したVEXコードをマテリアル定義に埋め込むことができます。 これをするには、そのシェーダのタイプに応じて、予約済みシェーダ名の“mss:surface_shader”または“mss:displace_shader”を使用する必要があります。 そのVEXコードは、それと同じ名前のプロパティとしてマテリアル定義に追加されます。 そしてさらに、これは、手動による作成ではなく、Pythonスクリプトで自動的にスタイルシートを生成するような大きなパイプラインで非常に役立ちます。
{ "materialDefinitions" : { "mss_const_mat" : { "properties" : { "surface" : "opdef:/Shop/v_constant clr 0.1 0.1 0.8", "displace" : "mss:displace_shader parm 0 0 1", "mss:displace_shader" : "displace disp1(vector parm=0) { P = P + parm; }" } } } }
スタイル ¶
styles
トップレベルキーは、スタイルオブジェクトのリストにマップします。
スタイルオブジェクトは以下のキーを持つことができます:
-
target
: ターゲットオブジェクト -
overrides
: オーバーライドオブジェクト
{ "styles" : [ { "target" : { "type": "self", "objectName" : "/obj/colored_object" }, "overrides" : { "material" : { "name" : "mss_const_mat" }, "materialParameters" : { "clr" : [ 0.8, 0.1, 0.2 ] } } } ] }
{ "target" : { "group" : "1 2", "preBindings" : { "top_level_prim" : "intrinsic:indexorder" }, "subTarget" : { "subTarget" : { "group" : "color_prims" } } }, "overrides" : { "materialParameters" : { "clr" : { "script" : { "importScript" : "mss_shared_script" } } } } }
ターゲット ¶
target
オブジェクトには、スタイルの影響を受けるエンティティを指定します。ターゲットジオメトリを参照してください。
これは以下のキーを持つことができます:
type
: "string"
このキーを"self"
に設定すると、このターゲットは、内容に関わらずスタイルシートが適用されるものに合致しなければなりません。
スタイルシートをシーンファイルに適用した場合、これは何の効果もありません。
スタイルシートをオブジェクトに適用した場合、“self”ターゲットは、そのオブジェクトに合致しなければなりません。 スタイルシートをアトリビュートのプリミティブに適用した場合、“self”ターゲットは、そのプリミティブに合致しなければなりません。 これは、スタイルの“top”ターゲットでのみ意味があり、サブターゲットには意味がありません。
name
: "object name"
オブジェクトに関しては、オブジェクトの名前またはパス。例えば、/obj/geo*
または単にgeo*
。
プリミティブに関しては、プリミティブ番号、またはname
やpath
のアトリビュートの値。
objectName
: "object_path"
オブジェクトのパスに合致します。プリミティブレベルでもこれを使用して、そのプリミティブを含んだオブジェクトに合致させることができます。 これは、2つのレベルを使用することなく、オブジェクトとプリミティブをターゲットにすることができます。
path
: "path string"
以下のどれかまたは両方:
-
オブジェクトまでのネットワークパス。例えば、
/obj/subnet1/char1
。 -
プリミティブまでの“name”のパス。
name
ターゲットタイプと同様に、“name”はプリミティブ番号、またはname
やpath
のアトリビュートの値です。例えば、agent_0/shape/0
。
両方使用する場合は、パスをコロンで区切らなければなりません。例: /obj/crowd_object:agent_0/shape/primitive
。
これは、入れ子状のターゲットを複数使用することと同じですが、ユーザインターフェースで表現する時はあまり明確にはならないので、このオプションはStyle Sheet Editorペインで廃止されました。
group
: "group spec"
グループ指定構文を使ってプリミティブを合致させます。
{ "target" : { "group" : "0 5 10 some_group" } }
{ "target" : { "group" : "@Cd.r>0.5" } }
shape
: "string"
name
によるエージェントプリミティブ内の特定の“shape”に合致します。
subTarget
: target object
このターゲットに合致したエンティティ内のエンティティに再帰的に合致します。
例えば、このターゲットオブジェクトは、プリミティブID #0のパックプリミティブに合致し、その中にパックされているプリミティブ #10に合致します:
{ "target" : { "group" : "0", "subTarget" : { "group": "10" } } }
preBindings
: {"attribute name": "bound name"}
オブジェクトは、合致したジオメトリ上のアトリビュートを受け取り、bound name
にそれらのアトリビュートの値を割り当てるので、そのbound name
を引数としてCVEXスクリプトに渡すことができます。バインドを参照してください。
オーバーライド ¶
overrides
オブジェクトには、スタイルがターゲットにしているプリミティブ上のマテリアルを変更する方法を指定します。オーバーライドを参照してください。
オーバーライドオブジェクトは以下のキーを持つことができます:
material
: {"name": "value"}
内部のname
キーの値を以下のどれかにすることができます:
-
マテリアルノードまでのパスを指定した文字列。
-
組み込みマテリアルを使用している場合は、これは共有マテリアルの名前です。
materialParameters
: {"parameter name": value}
合致したジオメトリに割り当てられたマテリアル上のパラメータの値を変更します。
{ "material" : { "name" : "/shop/material1" }, "materialParameters" : { "clr" : [ 0.8, 0.1, 0.2 ], "reflect": 0.5, } }
3つのキー内のvalueには、リテラル値(文字列、数値、配列)、{"script": script object}
のようなオブジェクトを指定することができます。
script
キーの値は、値の計算に使用するCVEXスクリプトを参照したスクリプトオブジェクトです。CVEXスクリプトの使い方を参照してください。
{ "materialParameters" : { "clr" : { "script" : { "importScript" : "mss_shared_script" } } } }
スクリプトオブジェクト ¶
CVEXスクリプトの使い方を参照してください。オブジェクトは以下のキーを持ちます:
以下のキーのどれか
command
: "path to .vex file"
指定した場所(ファイルパスやURL)のスクリプトを使用します。
code
: "inline VEX code"
1行のVEXコード文字列。
return
: "argument name"
cvex
関数は戻りタイプを持たないので、export
引数を使用して関数の結果を出力しなければなりません。関数が2個以上のexport
を持っている場合、これは、その結果として使用する引数を指定することができます。
bindings
:
Primitiveアトリビュート名を関数引数にマッピングしたオブジェクト。これは、アトリビュート/バインドの内容を引数として渡すことができます。バインドの書式を参照してください。
{ "command" : "$HIP/cvex/recolor.vex", "bindings": { "unpacked_id" : "intrinsic:indexorder", "packed_id" : "top_level_prim" } }
バインドオブジェクト ¶
バインドオブジェクトは、名前によって関数の引数をアトリビュートまたは他の値にマッピングします。そのオブジェクト内のキーは、その関数の引数名を意味します。 スタイルシートの書式では、それらの値に対して幾つかのバインドメソッドをサポートしています。
デフォルトのバインドスタスタイルは、引数名とアトリビュート名(Intrinsicアトリビュートを含みます)を関連付けます。この値は、アトリビュート名の文字列です。 指定した名前のアトリビュートが見つからなければ、その名前でターゲットバインドを検索します。
別の方法として、文字列の代わりにオブジェクトを使って別のタイプのバインドを指定することができます。このオブジェクトは、バインドメソッドを決定するsourceType
キーを持ちます:
default
これは上記で説明したように、文字列にマッピングするデフォルトの書式の使い方と同じです。オブジェクトは、アトリビュート(またはターゲットバインド)の名前を指定するためのname
キーを持ちます。
"bindings": { "foo": { "sourceType": "default", "name": "P" }, "bar": { "sourceType": "default", "name": "intrinsic:indexorder" } }
preBinding
これは、ジオメトリアトリビュートのチェックをスキップし、指定した名前のターゲットバインドを検索するだけです。
"bindings": { "foo": { "sourceType": "preBinding", "name": "aTargetName" } }
constant
これは、関数の引数と定数値を関連付けます。
"bindings": { "stringArg": { "sourceType": "constant", "value": "string" }, "intArg": { "sourceType": "constant", "value": 23 }, "vectorArg": { "sourceType": "constant", "value": [1.0, 1.0, 2.0] } }