サードパーティ シェーダのカスタム UI

MAXtoA のプラグインおよびシェーダ

MAXtoA プラグインは、3ds Max に Arnold シェーダを統合します。この統合により、すべてのビルトイン シェーダおよびサードパーティ シェーダを 3ds Max に統合し、シーンのレンダリング中に使用することができます。

Arnold のビルトイン プラグインおよびシェーダは、MAXtoA によって自動的にロードされます。サードパーティ シェーダをロードするには、MAXtoA ディレクトリまたはプラグイン パスのディレクトリ(Render ダイアログで設定)にシェーダを配置する必要があります。ただし、この統合を可能にするには、MAXtoA プラグインが存在する必要があります。

MAXtoA は Arnold シェーダ ノードをマッピングします。また、一致する 3ds Max マテリアルとテクスチャを作成するために、これらの整合性を維持し、ユーザ インタフェースを構築して、3ds Max ユーザが Arnold シェーダを操作できるようにします。

このユーザ インタフェースの統合は自動的に実行されるため、シェーダ開発者は何もする必要がありません。Arnold が ActiveShade またはプロダクション レンダラーとして設定されると、Arnold シェーダは 3ds Max に自動的にロードされ、マテリアル エディタに表示されます。

マテリアル エディタ内の Arnold シェーダ

これ以降、シェーダを作成するには、他の 3ds Max マテリアルまたはマップと同様に、マテリアル エディタの 3 つのビューでシェーダを選択して、キャンバス上でノードをドラッグ アンド ドロップするか、名前をダブル クリックします。

シェーダはマップ/マテリアル ブラウザの Arnold カテゴリに配置されます。これらのシェーダは、メタデータに従って分類されます(詳細については、以下を参照)。

シェーダに該当するカテゴリがない場合は、ロード元の DLL の名前で分類されます。OSL シェーダの場合は「OSL」カテゴリに、ビルトインの Arnold コアの場合は「Built-in」カテゴリに分類されます。

シェーダ開発者が定義したシェーダのアトリビュートが表示されます。シェーダ(3ds Max の用語で言えば、マテリアルまたはマップ)をダブル クリックすると、作成するシェーダのユーザ インタフェースがトリガーされて、マテリアル エディタの右側ペインに表示されます。

UI カスタマイズの概要

シェーダ開発者は、必要に応じて、シェーダのユーザ インタフェースをカスタマイズできます。次の 2 つの方法があります。

メタデータを使用すると、コントロールの名前変更、グループ化、再並べ替えを実行できますが、レイアウトは影響を受けません。一方、ui ファイルを使用すると、シェーダのカスタム ユーザ インタフェースをかなり複雑に設計することができます。

自動ユーザ インタフェース

MAXtoA はシェーダ開発者に、任意のシェーダのユーザ インタフェースを作成する自動実行メカニズムを提供します。開発者は、シェーダを 3ds Max で使用可能にする以外、何もする必要はありません。

ドキュメントで使用するために、サポート ファイルを含む単純なシェーダが用意されています。kick ユーティリティを使用すると、シェーダのアトリビュートを一覧表示できます。コマンド「Kick –info simple」を実行すると、次の出力が生成されます。

 Type           Name                              Default  
 ------------  --------------------------------  --------------------------------  
 INT           integer                           -3  
 UINT          unsigned_int                      4  
 FLOAT         float                             1.92  
 BOOL          boolean                           false  
 RGB           color                             0.7, 0.7, 0.7  
 RGBA          acolor                            1, 0, 0, 1  
 POINT         point                             1, 2, 3  
 POINT2        point2                            5, 6  
 ENUM          elements                          space 

カスタム UI が定義されていない場合、生成される UI はこのようになります。  ご覧のとおり、パラメータ名がラベルとして使用され、リンク可能な各パラメータは入力の選択に使用されるボタンになります。

パラメータ マッピングと接続を有効/無効にするためのコントロールのみを含む、2 番目のロールアップが作成されます。

生成されたユーザ インタフェースは整理されていて、そのまま使用できます。パラメータ名は「美しく整えられる」ことに注意してください。アンダースコアを含むパラメータ名はスペースで区切られ、各単語の先頭文字が大文字になります。したがって、

unsigned_intUnsigned Int のようになります。

ユーザ インタフェースのカスタマイズ

カスタム ユーザ インタフェースを構築できるようにするには、Arnold と 3ds Max 間のパラメータの一致について理解し、使用するコントロールのタイプを把握する必要があります。

パラメータがリンク可能かどうかに応じて、すべての Arnold シェーダに対して、3ds Max パラメータ(1 個または 3 個)を生成します。

次の図からわかるとおり、パラメータ unsigned_int には、パラメータ ロールアップ内に 2 つのコントロールがあります(番号、およびマップを格納するスロット)。  3 番目のコントロール(マップを有効にする)は、Maps ロールアウトに含まれています。

したがって、unsigned_int という名前の「単純」なシェーダ パラメータの場合、MAXtoA は unsigned_intunsigned_int.shader、および unsigned_int.connected のパラメータを生成します。パラメータ名は大文字と小文字が区別されます。

MAXtoA は UI を生成するときに、2 つのロールアップ(Parameters および Maps)を作成し、グリッド レイアウト内にさまざまなコントロールを配置します。

この場合、パラメータ タイプとコントロール タイプの関連付けは自動的に行われます。

メタデータ UI のカスタマイズ

シェーダ UI をカスタマイズするには、第 1 段階としてメタデータ ファイルを使用します。  このファイルには、シェーダ DLL と同じ基本名が付いている必要があります。したがって、例では、sampleShader.DLL ファイルと sampleShader.mtd ファイルを使用します。

アトリビュート名

実行できる、最もわかりやすい最初のカスタマイズは、パラメータにわかりやすい名前を付けることです。  そのためには、シェーダのすべてのアトリビュートに数行を追加します。次に、わかりやすい名前を付けたシェーダ UI を示します。

ユーザはアトリビュート パラメータを使用して、数値範囲のコントロールや、ツールチップの追加などを実行できます。


  [node simple]   
  …  
  [attr unsigned_int]  
  max.label STRING "Unsigned Integer"  
  desc STRING "This is the UNSIGNED INTEGER tooltip"  
  min INT 0  
  max INT 6 

シェーダ パラメータの並べ替え

シェーダ UI をカスタマイズするもう 1 つの方法は、パラメータを並べ替えることです。これは、「ノード」レベルで行う必要があります。

   [node simple]  
  max.order STRING "boolean integer unsigned_int color acolor string" 

リスト内にないパラメータは、末尾に追加されます。  存在しないパラメータの名前は、無視されます。

ロールアップの生成

多数のパラメータを含むシェーダには、フォルダ パラメータを使用してグループ化するよう指定することができます。

  [node simple]  
  max.parm.folder.folder1 STRING "Rollup1;2;Rollup2;3" 

フォルダ情報を指定する場合、指定したパラメータの数のみが表示されます。安全性を高めて、残りのパラメータを選択する 3 番目のロールアップを追加します。

Qt の .ui ファイルを使用したカスタム UI

カスタム UI は、シェーダ パラメータを操作する際に使用できる UI をシェーダ設計者が完全に設計するためのメカニズムです。

UI ファイルは、自由にダウンロード可能な Qt Designer を使用して編集できます。ファイル形式についてはこちら(http://doc.qt.io/qt-4.8/designer-ui-file-format.html)を参照してください。

MAXtoA は、シェーダ DLL を調べるときに記載されていた内容に従い、Qt ウィジェットの名前を使用して UI コントロールを MAXtoA パラメータにマップします。UI ファイルの場所は、ロードされているプラグインの場所に対して相対的に指定されます。

そのため、すべてのシェーダに対して、UI ファイルを保存するサブ ディレクトリを作成できます。メタデータを指定することで、MAXtoA は UI ファイルを検索およびロードし、これらを使用してカスタム ユーザ インタフェースを構築することができます。UI ファイルの場所は次のとおりです。

<shader-location>/MAXtoA_ui/<Shader-Name>/<ui-files>

たとえば、standard_surface シェーダ UI のファイルは、次の場所に格納されています。

<MAXtoA dir>/MAXtoA_ui/standard_surface

現在のディストリビューションでは、MAXtoA_ui/standard_surface ディレクトリ内に basic.ui、coating.ui、emission.ui、special.ui、specular.ui、sss.ui、および transparent.ui の 7 つの UI ファイルがあります。メタデータ ファイルを使用すると、standard_surface シェーダの UI で実行する内容を記述できます。次のようになります。

マッピング コントロール

この操作を実行するために、開発者は、どのコントロールを使用して、どのタイプのパラメータを編集できるのかを把握しておく必要があります。max.parm.folder.folder1 およびカスタム UI は互換性がないことに注意してください。.ui ファイルで、パラメータ タイプをコントロール タイプに正しく関連付ける必要があります。次に、Arnolds パラメータのタイプと、使用するのに最適なコントロールのリストを示します。

Arnold コントロール
INT、UNIT、BYTE MaxSDK::QMaxSpinBox
BOOLEAN QCheckbox
ENUM QComboBox
FLOAT MaxSDK::QMaxDoubleSpinBox

単位が必要な場合は、MaxSDK::QMaxWorldSpinBox を使用します
ビットマップ QPushButton
Shader QPushButton
文字列 QEditField
POINT、VECTOR MaxSDK::QMaxPoint2Spinner
POINT2 MaxSDK::QMaxPoint2Spinner
POINT3 MaxSDK::QMaxPoint3Spinner
行列 MaxSDK::QMaxMatrix3Spinner
RGB、RGBA MaxSDK::QMaxColorSwatch

3ds Max コントロールはさまざまな方法で作成できますが、最も簡単なのは(手作業で UI ファイルを編集する以外)、Qt Designer を使用して、次の手順に従うことです。

  1. 該当するウィジェット タイプを新しい形式のタイプ ウィジェットにドラッグ アンド ドロップします。
  2. Qt の標準でないコントロールについては、コントロール「ウィジェット」をドラッグ アンド ドロップします。
  3. 新しく作成されたウィジェットを使用して、コンテキスト メニュー「Promote To...」から選択します。
  4. 適切な基本クラスを選択します(上記リストを参照)。
  5. 適切な 3ds Max クラス名を入力します(上記のリストから選択)。
  6. ヘッダー ファイルを自動的に生成して、Add をクリックします。
  7. Promote をクリックします。

一般に、カスタム UI の構築は簡単ですが、従う必要があるルールがいくつかあります。

パラメータ名に関する規則

上記のとおり、MAXtoA はすべての Arnold パラメータに対して、1 個または 3 個のパラメータを生成します。生成されるパラメータの個数は、パラメータが接続可能かどうかによって決まります。「.connected」および「.shader」パラメータが Maps ロールアウトに自動的に追加されます。

ただし、これらを UI のメイン ページにも表示する必要がある場合は(小さなマップ ボタンなど)、適切なコントロールを使用して、ウィジェットにパラメータ名を付けることによって、これらのパラメータをカスタム UI に追加できます。

したがって、unsigned_int.connected の場合は、チェックボックス コントロールを作成し、適切に名前を付ける必要があります。  残念ながら、Qt Designer では、ピリオド「.」文字をウィジェット名として使用できません。  この問題を解決するために、MAXtoA はパラメータ名を unsigned_int__dot__connected として認識し、プログラムで「dot」を「.」に自動的に置き換えます。

カスタム UI ラベルでツールチップを機能させるには、ラベル ウィジェットに、_label の後にパラメータ名が続く名前を付ける必要があります。  たとえば、パラメータ count の場合、ラベル ウィジェットには count_label という名前を付ける必要があります。

MAXtoA でサポートされるメタデータ パラメータ

メタデータ ファイルは Arnold のメタデータ仕様に従います。「メタデータ ファイル」を参照してください。

注: ドキュメントに記載されているとおり、慣例的に、Maya 固有のメタデータには、「maya.」で始まるメタデータ名を使用し、XSI 固有のメタデータには、「xsi.」を使用しています。個別のドキュメントにパブリッシュされる標準のメタデータ要素には、他にいくつかの規則があります。

MAXtoA は複数のメタデータ トークンをサポートします。ノード セクションの場合[node shader-name]

max.hidden bool シェーダは 3ds Max に表示されません
max.help_url string ヘルプ リンク
max.category string カテゴリ
max.label string ラベル
max.parm.folder.folder[0..9] string 自動 UI メカニズムの場合

ロールアップ名およびパラメータの数を記述します

例: max.parm.folder.folder1 STRING "Diffuse;6;Specular;9"
max.order[0..9] string 自動 UI メカニズムの場合

パラメータの順序を記述します。  パラメータ リストを拡張するには、max.order[1…9] を使用します。

ノードの例:

   # comment 

   [node standard] 

   max.category STRING "Shading" 

   max.parm.folder.folder1 STRING “Diffuse;8;Specular;10" 

   max.order STRING "folder1 Kd_color Kd direct_diffuse " 

   max.order2 STRING "Ks_color Ks direct_specular indirect_specular" 

アトリビュート セクションの場合[Attr attribute-name]

max.type string
max.label string ユーザ パラメータ名
max.disable_when string コントロールを無効にする場合(説明が必要)
min int 範囲最小
max int 範囲最大
desc string 説明(ツールチップ)
linkable bool パラメータをシェーダ出力に接続できるかどうかを定義

カスタム ユーザ インタフェースの場合に使用できるその他のアトリビュート

ノート アトリビュート

max.rollup string ロールアップ カスタム UI ファイル名を記述します

例: max.rollup STRING "diffuse;specular"

この場合、MAXtoA_ui/ ディレクトリ内に diffuse.ui ファイルと specular.ui ファイルがあります。  このディレクトリの相対パスは、シェーダの DLL と同じです。

例:

   max.rollup STRING "diffuse;specular;reflection;refraction;sss;emission;aov" 

   [Attr rollup-<ui-name>] 
max.label string ロールアップ ユーザのタイトル

例:

   [attr rollup-diffuse] 

   max.label STRING "Diffuse"