Houdini 19.5 マテリアル

Material Stylesheets

Material Stylesheetsは、マテリアルの割り当てやパックジオメトリ上のマテリアルパラメータの上書きをするための高度なテクニカルソリューションです。

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

ターゲットの指定と、そのターゲットとなるジオメトリに適用する オーバーライド のリストを含みます。

スタイルは、独自のオーバーライドを含むことができたり、複数のスタイルから使用可能な共有オーバーライドのセットを参照することができます。

Target

特定のジオメトリに合致させる条件のリスト。以下のターゲットを参照してください。

Override

ターゲットジオメトリに適用する新しいマテリアルの割り当て/マテリアルのパラメータの値。以下のオーバーライドを参照してください。

Shared material

スタイルシート内のオーバーライドを持つマテリアルを参照し、そのマテリアルをターゲットジオメトリに割り当てることができます。

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

プリミティブ番号、またはプリミティブのnamepathのアトリビュートの値。例えば、/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ペインを作成する

  1. ペインの上部にある New tabアイコンをクリックします。

  2. New pane tab type ▸ Data tree を選択します。

  3. 左上コーナーのポップアップメニューをクリックして、“Material Style Sheets”を選択します。

新しいスタイルシートを作成する

  1. Editorペインで New style sheet をクリックします。

  2. 新しいスタイルシートに名前を付けて、オプションで説明を加えます。

    • 新しいスタイルシートブランクを始めるには、 New style sheet をクリックします。

    • 既存ファイルの内容を使って新しくスタイルシートを始めるには、 Import from file をクリックして、ファイルを選択します。これはファイルの内容だけを受け取ります。つまりファイルの場所が保存されません。

    • 現行ファイル内のジオメトリへの既存のマテリアル割り当てすべてに相当する命令を含んだスタイルシートを作成するには、 Existing material overrides をクリックします。 これは、スタイルシートを使用して、ファイル内のジオメトリレベルのマテリアル割り当てすべてを置換したい場合に役に立ちます。

オブジェクトにスタイルシートを追加する

  1. Editorペインで、(ツリー内のスタイルシートの下にある)obj/内でオブジェクトを見つけます。

  2. ツリー内のオブジェクトを右クリックして、“Add stylesheet parameter”を選択します。これは、スタイルシートをオブジェクト上のパラメータに適用するように、その内容をセットアップします。

    または

    オブジェクトを右クリックして、“Create style sheet from existing overrides”を選択します。 これは、オブジェクト内のジオメトリレベルのマテリアル割り当てに相当するスタイルシートを使ってオブジェクト上のパラメータをセットアップします。

スタイルをスタイルシートに追加する

Editorペインで、ツリー内のスタイルシートを右クリックして、 Add style を選択します。

ターゲット指定をスタイルに追加する

Editorペインで、ツリー内のスタイルを右クリックして、 Add target を選択します。

  • 新しいターゲット指定に条件を追加するには、そのターゲット指定を右クリックして、 Add condition を選択します。色々なタイプの条件は、条件を参照してください。

  • 新しいターゲットの結果に対して再帰的にターゲットを追加するには、そのターゲットを右クリックして、 Add sub-target を選択します。

  • ビューポートで現在選択されているものに合致するように自動的にターゲットに条件を追加するには、新しいターゲット指定を右クリックして、 Set target from viewport selection を選択します。

スタイル内のマテリアル割り当てを上書きする

  1. Editorペインで、ツリー内のスタイルを右クリックして、 Add override を選択します。

  2. “Type”の列で、“Set Material”メニューアイテムを選択します。

  3. “Override value”の列で、ノード選択アイコンをクリックして、マテリアルを選択します。

スタイル内に1個のマテリアルオーバーライドしか持つことができません(その理由は、2回以上もマテリアルを上書きするするのは意味がないからです)。

スタイル内のマテリアルパラメータを上書きする

  1. Editorペインで、ツリー内のスタイルを右クリックして、 Add override を選択します。

  2. “Override name”の列で、パラメータ選択アイコンをクリックして、マテリアル上のパラメータを選択します。

    (現在のシーンファイル内にマテリアルをインスタンス化していない場合、そのパラメータ選択アイコンを使用しなくても、その列内にパラメータの 内部 名をタイプすることができます。)

  3. “Override value”の列で、新しい値を設定するためにクリックします。

複数のスタイル間で同じオーバーライドを共有する

まず最初に、複数のスタイルが参照可能な 共有オーバーライトセット を作成します:

  1. ツリー内のスタイルシートアイテムで、“共有するオーバーライドセット”を右クリックして、 Add shared override set を選択します。そのオーバーライドセットに名前を付けてEnterを押します。

  2. その新しいオーバーライドセットアイテムを右クリックして、overridesを選択して、そのセットに追加します。

そして、スタイル内のその共有オーバーライドセットを参照するには:

  1. スタイルを右クリックして、 Add shared override set を選択します。

  2. 新しいアイテムで、 Value 列のポップメニューをクリックして、オーバーライドセットを選択します。

同じスタイル内で複数の共有オーバーライドセットを参照することができます。これは、使用頻度の高いオーバーライドを小さいセットに分解して、特定のスタイルで必要なオーバーライドを適用することができます。

スタイルシートの順番を変更する

スタイルシートをツリー内で上下にドラッグします。

他のスタイルシートの内容を参照する

  1. ツリー内のスタイルシートアイテムで、“Imported files”アイテムを右クリックして、 Add stylesheet reference を選択します。

  2. “Type”列で、シーンファイルに組み込まれたスタイルシートを参照するか、またはディスク上のJSONファイルを参照するかどうか選択します。

  3. “Value”列で、参照するスタイルシートを選択します。

Editor内でアイテムを検索する

Filter フィルターを使用することで、特定のテキストを含んだ行のみを表示させることができます。例えば、指定した名前のマテリアルを割り当てるスタイルを表示させることができます。

追加情報を取得する

スタイル、ターゲット、コンディションのアイテム上でクリックします。

スタイルシートをJSONとして取得する

  • オブジェクトレベルのスタイルシートに関しては、スタイルシートは、そのオブジェクトのパラメータにJSONテキストとして格納されています。

  • シーンレベルのスタイルシートに関しては、スタイルシートエディタを使ってJSONを閲覧することができます:

    1. ツリー内で、スタイルシート項目を右クリックして、 View JSON を選択します。

    2. ウィンドウ内の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行に\nを使用することができますがエスケープ文字を使わなければなりません)ので通常では役に立ちません。

Shared script

“Override value”列内をクリックして、“Shared scripts”アイテムでスクリプトをどれか選択します。

External script file

“Override value”列にスクリプトファイルの場所(ファイルパスまたはURL)を入力または選択します。

Script from SHOP

VEX SHOPまたはVOP CVEX SHOPを“スクリプト”として選択して、値を生成します。これは、VOPネットワークを構築することで“スクリプト”の挙動を定義することができます。

Attribute binding

単にアトリビュート値(バインドされた名前)に基づいてマテリアルパラメータ値を設定するCVEXコードを生成します。“Override value”列でアトリビュート名/バインドされた名前を入力します。

スクリプトのバインド

スクリプトは、合致したジオメトリ上のアトリビュート値をCVEX関数の名前付き引数に“バインド”することができます。

ターゲットにしている階層内の高いターゲットレベルほど、 その レベルでアトリビュート値をバインドすることもできます。 そして、CVEXスクリプトへの引数として利用可能なそれらの バインドされたデータ を作成することができます。

例えば、スタイルがパックプリミティブ12をターゲットにしていると仮定すると、 サブターゲットは、そのパックプリミティブ内のcolor_primsグループに合致します。 パラメータオーバーライドスクリプトを使用すると、Mantraはcolor_prims内のプリミティブ毎に対してスクリプトを実行します。 スクリプトにはパックプリミティブのプリミティブ番号を知らせる必要があります。 それをするために、トップターゲットにintrinsic:indexorderアトリビュートの値をtop_level_primという名前に バインド することができます。 スクリプトがコールされると、Mantraは、そのスクリプトにパックプリミティブ番号を含んだtop_level_prim引数を渡します。

To...Do this

スクリプトまたはターゲットにバインドを追加する

  1. ツリー内で、スクリプト/ターゲットのアイテムを右クリックして、 Add script binding を選択します。

  2. 新しいバインドの行で、“Override name”列をクリックして、 argument name を入力します。

  3. “Override value”列をクリックして、 attribute name を入力します。

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トップレベルキーは、スタイルオブジェクトのリストにマップします。

スタイルオブジェクトは以下のキーを持つことができます:

{
    "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*。 プリミティブに関しては、プリミティブ番号、またはnamepathのアトリビュートの値。

objectName: "object_path"

オブジェクトのパスに合致します。プリミティブレベルでもこれを使用して、そのプリミティブを含んだオブジェクトに合致させることができます。 これは、2つのレベルを使用することなく、オブジェクトとプリミティブをターゲットにすることができます。

path: "path string"

以下のどれかまたは両方:

  • オブジェクトまでのネットワークパス。例えば、/obj/subnet1/char1

  • プリミティブまでの“name”のパス。nameターゲットタイプと同様に、“name”はプリミティブ番号、またはnamepathのアトリビュートの値です。例えば、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)のスクリプトを使用します。

importScript: "shared script name"

scriptDefinitionsオブジェクト内の共有スクリプトを参照します。

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]
    }
}

マテリアル

マテリアルの使い方

テクスチャとUV

マテリアルの作成

導師レベル

他のレンダラー