付録 E: mental ray ユーザ データ ノード

ここでは、mental ray ユーザ データ ノードとそれを Maya 内部で使用する方法について簡単に説明します。

概要

mental ray は、定義済みタイプの多くのシーン構成要素をサポートしています。ただし、シーン内のデータを効率的に表現するのにこれらの構成要素タイプでは十分でなかったり、構成要素がカスタム データやカスタム アトリビュートを含んでいると便利だったりすることがあります。こうした問題を解決するため、シーンのほぼどこでもユーザ データ構成要素を使用および配置できるようになっています。

ユーザ データ タイプ

2 つのタイプのユーザ データがサポートされています。

どちらのタイプのユーザ データも、独自の特定のノード表現を持っています。

Declared ユーザ データの利点は、mental ray がパラメータの型を知っているということです。したがって、あるプラットフォームで作成されたデータを別のプラットフォームで異なるバイト順序(エンディアンネス)でレンダリングする場合、mental ray はデータを適切に入れ替えることができます。

一方、Literal ユーザ データは、必要に応じてスワッピングに備えて準備が必要です。たとえば、スワッピングが必要かどうかの検出を可能にする整数値を追加します。こうした準備は、データを読み出すシェーダで実行される必要があります。

Literal ユーザ データ

このユーザ データ タイプは、Maya の新しいノード タイプ mentalrayUserData で表されます。これには、ASCII エンコーディング(.mi ファイルで使用されます)または実際のバイト ブロックを設定または取得するための 2 つの入力アトリビュート(asciiDatabinaryData)が用意されています。

ASCII 表現では Maya 内部で使用できる 7 ビット文字だけが使用されるため、ASCII 表現はタイプ文字列のノード アトリビュートに簡単に格納されます。エンコーディングでは 1 バイトに 2 文字が使用されます。したがって、文字列の長さは 2 の倍数である必要があります。.mi ファイルの書き出しの場合、この表現は基本的にコピーされます。統合されたレンダリングの場合、データはプラグインでデコードされ、結果のバイダリ データ ブロックが mental ray のコアに提供されます。

Declared ユーザ データ

このユーザ データ タイプは、入力アトリビュートのセットが用意されていることから、通常のシェーダ ノードとよく似ています。シェーダと異なり何も計算されず、ノードはデータ ホルダとしてのみ機能するため、出力アトリビュートは用意されていません。

通常のカスタム シェーダと同様に、このノード タイプはシェーダ マネージャを介してデータの .mi 宣言から生成されます。ノード ファクトリは、これがユーザ データ ノードであることを検出し、すばやく識別できるようにそのようなノードに miFactoryData アトリビュートを使用して内部的にマークを付けます。

他のファクトリ ノードの場合と同じように Maya ユーザ インタフェースが作成され、アトリビュート エディタ(Attribute Editor)で値を設定できるようになります。mental ray では、他のノードへの接続はサポートされていません。したがって、Maya の接続はトランスレーション時に解消され、そのフレームの固定値で書き出されます。

Maya での使用法

どちらのタイプのユーザ データ ノードも 2 つの方法で使用できます。

ユーザ データ ノードは標準の .message プラグを使用して接続する必要があります。実際には、他のどのプラブも接続に使用でき、プラグ自体は関係ありません。

Maya 内部のデータ ノードは、標準ツール(たとえば、接続エディタ(Connection Editor)ハイパーグラフ(Hypergraph)またはハイパーシェード(Hypershade)からのドラッグ&ドロップなど)を使用してアタッチできます。

Maya のシェーダへの接続は直接的である必要があります。シェイプ ノード(ジオメトリ、ライト、カメラなど)またはトランスフォーム ノード(DAG インスタンス)のようなシーン構成要素への接続では、ダイナミック アトリビュート miData (メッセージ)を追加し、トランスレーション時に認識されるようにそれをユーザ データ ノードに接続する必要があります。

アニメートされたデータ

アニメーションでは、ユーザ データのアトリビュートやバイト ブロックのフレーム間での変更はプラグインによって検出され、結果として、mental ray で増分的な変更が行われるか、.mi ファイルが書き出されます(フレーム単位のファイルのオプションが無効の場合)。

mental ray でのアクセス

ユーザ データ ノードをシェーダ パラメータにアタッチすると、提供されたタグ値を入力パラメータから渡す mental ray の mi_db_*() 機能を使用して、カスタム シェーダでデータにアクセスすることができます。ほとんどの場合、mental ray はユーザ データの内容に関与しません(スワッピングが必要となる場合を除く。上記を参照)。

ユーザ データ メモリへのポインタがいったん読み出されると、Declared ユーザ データの値にアクセスするのは、一致する宣言を持つ C 構造体のフィールドを読み込むのと似ています。Literal バイト データの場合、データのレイアウトは mental ray には未知なので、構造化とデコードはすべてシェーダに任されます。

一般的なヒント

mental ray では、いくつかのユーザ データ ブロックをチェーンで「つなげ」、そのチェーンを 1 つのシーン構成要素にアタッチすることができます。この場合、できればブロックの最初の値として、ユーザ データに「魔法の」番号を追加します。それにより、シェーダはそのユーザ データを要求されたユーザ データであると特定できるようになります。