ここでは、mental ray ユーザ データ ノードとそれを Maya 内部で使用する方法について簡単に説明します。
mental ray は、定義済みタイプの多くのシーン構成要素をサポートしています。ただし、シーン内のデータを効率的に表現するのにこれらの構成要素タイプでは十分でなかったり、構成要素がカスタム データやカスタム アトリビュートを含んでいると便利だったりすることがあります。こうした問題を解決するため、シーンのほぼどこでもユーザ データ構成要素を使用および配置できるようになっています。
どちらのタイプのユーザ データも、独自の特定のノード表現を持っています。
Declared ユーザ データの利点は、mental ray がパラメータの型を知っているということです。したがって、あるプラットフォームで作成されたデータを別のプラットフォームで異なるバイト順序(エンディアンネス)でレンダリングする場合、mental ray はデータを適切に入れ替えることができます。
一方、Literal ユーザ データは、必要に応じてスワッピングに備えて準備が必要です。たとえば、スワッピングが必要かどうかの検出を可能にする整数値を追加します。こうした準備は、データを読み出すシェーダで実行される必要があります。
このユーザ データ タイプは、Maya の新しいノード タイプ mentalrayUserData で表されます。これには、ASCII エンコーディング(.mi ファイルで使用されます)または実際のバイト ブロックを設定または取得するための 2 つの入力アトリビュート(asciiData と binaryData)が用意されています。
ASCII 表現では Maya 内部で使用できる 7 ビット文字だけが使用されるため、ASCII 表現はタイプ文字列のノード アトリビュートに簡単に格納されます。エンコーディングでは 1 バイトに 2 文字が使用されます。したがって、文字列の長さは 2 の倍数である必要があります。.mi ファイルのエクスポートの場合、この表現は基本的にコピーされます。統合されたレンダリングの場合、データはプラグインでデコードされ、結果のバイダリ データ ブロックが mental ray のコアに提供されます。
このユーザ データ タイプは、入力アトリビュートのセットが用意されていることから、通常のシェーダ ノードとよく似ています。シェーダと異なり何も計算されず、ノードはデータ ホルダとしてのみ機能するため、出力アトリビュートは用意されていません。
通常のカスタム シェーダと同様に、このノード タイプはシェーダ マネージャを介してデータの .mi 宣言から生成されます。ノード ファクトリは、これがユーザ データ ノードであることを検出し、すばやく識別できるようにそのようなノードに miFactoryData アトリビュートを使用して内部的にマークを付けます。
他のファクトリ ノードの場合と同じように Maya ユーザ インタフェースが作成され、アトリビュート エディタ(Attribute Editor)で値を設定できるようになります。mental ray では、他のノードへのコネクションはサポートされていません。したがって、Maya のコネクションはトランスレーション時に解消され、そのフレームの固定値でエクスポートされます。
どちらのタイプのユーザ データ ノードも 2 つの方法で使用できます。
ユーザ データ ノードは標準の .message プラグを使用してコネクトする必要があります。実際には、他のどのプラブもコネクションに使用でき、プラグ自体は関係ありません。
Maya 内部のデータ ノードは、標準ツール(たとえば、コネクション エディタ(Connection Editor)、ハイパーグラフ(Hypergraph)またはハイパーシェード(Hypershade)からのドラッグ&ドロップなど)を使用してアタッチできます。
Maya のシェーダへのコネクトは直接的である必要があります。シェイプ ノード(ジオメトリ、ライト、カメラなど)またはトランスフォーム ノード(DAG インスタンス)のようなシーン構成要素へのコネクトでは、ダイナミック アトリビュート miData(メッセージ)を追加し、トランスレーション時に認識されるようにそれをユーザ データ ノードにコネクトする必要があります。
アニメーションでは、ユーザ データのアトリビュートやバイト ブロックのフレーム間での変更はプラグインによって検出され、結果として、menral ray で増分的な変更が行われるか、.mi ファイルがエクスポートされます(フレーム単位のファイルのオプションが無効の場合)。
ユーザ データ ノードをシェーダ パラメータにアタッチすると、提供されたタグ値を入力パラメータから渡す mental ray の mi_db_*() 機能を使用して、カスタム シェーダでデータにアクセスすることができます。ほとんどの場合、mental ray はユーザ データの内容に関与しません(スワッピングが必要となる場合を除く。上記を参照)。
ユーザ データ メモリへのポインタがいったん読み出されると、Declared ユーザ データの値にアクセスするのは、一致する宣言を持つ C 構造体のフィールドを読み込むのと似ています。Literal バイト データの場合、データのレイアウトは mental ray には未知なので、構造化とデコードはすべてシェーダに任されます。
mental ray では、いくつかのユーザ データ ブロックをチェーンで「つなげ」、そのチェーンを 1 つのシーン構成要素にアタッチすることができます。この場合、できればブロックの最初の値として、ユーザ データに「魔法の」番号を追加します。それにより、シェーダはそのユーザ データを要求されたユーザ データであると特定できるようになります。