各レンダー項目(MRenderItem)には、シェーダとの 1 対 1 の関係があります。 全体のフレームワークはプログラマブル シェーディングに基づいていますが、MShaderInstance はハードウェア プログラマブル シェーダのラッパーです。 このセクションでは、既にハードウェア エフェクトを使い慣れているものと仮定して説明を進めます。
この特定のインタフェースは、レンダリング フレームワークと共にエフェクト ベースのシェーダを使用するための、最も統合されたソリューションを提供することを目的としています。このインタフェースにおける重要なプロパティは、簡易化、柔軟性、管理性、相互運用性です。
古いインタフェースで最も一致するものは、ハードウェア シェーダ プラグイン インタフェース(MPxHwShaderNode)です。次に示す一覧表で、MPxHwShaderNode と MShaderInstance との比較を示します。
特徴 |
MPxHwShaderNode インタフェース |
MShaderInstance インタフェース |
インタフェース |
新しいノード タイプを作成する必要があり、サーフェス シェーダ オーバーライドとしてのみ使用することができます。 |
DG ノードを作成する必要がなく、サーフェス シェーダに割り当てられます。そのため、複数の API インタフェースに使用(または再使用)できます。 |
パラメータ |
カスタム コードは、プラグインの一部として書き込まれる必要があります。 |
均一パラメータ定義および更新は、内部的にサポートされます。単純な、および複雑なデータ型がともにサポートされ、パラメータのバインドは、テクスチャやターゲットなど、すべての公開 API リソース タイプで動作します。 |
エフェクトのサポート |
互いの間に共通なものがほとんどあるいはまったくない異なる言語をサポートするために、個別のプラグインが使用されています。ロード、解析、コンパイル、保守はすべてプラグインのコードに任されています。 |
サポートされているシェーダは、エフェクト ファイルを基本にしたものです。ディスク上のエフェクト ファイルを読み込んでコンパイルすることによってシェーダ インスタンスを返すことができます。ディスク上のエフェクトは、変更があるか自動的に監視されています。このプラグインのためにコードを追加してサポートする必要ありません。 OGSFX ファイルを使用することで DirectX11 HLSL、OpenGL CgFX、GLSL がサポートされています。 詳細については、『Maya ユーザ ガイド』の「シェーディング」セクションの「ハードウェア シェーダを作成およびレンダーする」と「GLSL シェーダを作成および視覚化する」を参照してください。 |
セマンティック バインド |
カスタム コードは、プラグインの一部として書き込まれる必要があります。 |
各種の均一パラメータまたは変更パラメータを自動的にバインドするために、SAS セマンティックのセットがサポートされています。 サポートされるセマンティックには、サーフェス シェーディングとスクリーン スペース レンダリングに必要なものが含まれています。 CgFX と HLSL のそれぞれでサポートされるセマンティックはほとんど同じですが、シェーディング言語の違いによって多少異なります。 |
内部シェーダへのアクセス |
この概念は、このインタフェースでは対応していません。 |
内部的に提供されているプリセット シェーダが多数用意されています。 これらは、レンダリング フレームワークとの自動統合を提供します。ライト バインド、フル スクリーン エフェクト、透明度などの機能には、追加の作業は必要ありません。 MPxShadingNodeOverride の実装により、Maya に組み込まれているシェーダに、このインタフェースを介してアクセスすることができます。 |
シェーダ管理 |
すべてのシェーダは内部リソース マネージャによって管理され、共有、再利用することができます。 |
|
状態の管理 |
テクニック、受け渡しや他の状態管理は、レンダリング フレームワーク内で内部的に追跡されます。 すべての最適化は、プラグインのソース コードを変更することなく、自動的に提供されています。 |
左の図では、MShaderInstance がフレームワークの一部として組み込まれています。MShaderManager クラスが表示されています。 これは、内部リソース管理システムによって保持されているシェーダ リソースへの API インタフェースです。右の図では、MPxHwShaderNode の有効な設定を示しています。すべての「カスタム」ボックスは、プラグイン ライタで記述する必要があります。
ここではシェーダ インスタンスとシェーダという異なる用語を使用していることに注意してください。この 2 つは次のように区別しています。シェーダはアルゴリズムの定義と入力/出力パラメータの定義を提供します。これに対しシェーダ インスタンスは、シェーダの特定のインスタンスに対してパラメータ入力値やバインドを定義します。
シェーダ インスタンスを取得するには、マネージャのインタフェースを使用して、ディスクからエフェクト ファイルをロードするか内部的に作成されたインスタンスを取得します。マネージャの重要なプロパティは次の通りです。
MShaderManager::getEffectsFileShader() や MShaderManager::getEffectsBufferShader() などの MShaderManager でさまざまなインタフェースのいずれかを介してシェーダを取得する際に、シェーダ コンパイルの失敗が発生すると、エラーが Windows および Linux の出力ウィンドウ(Output Window)と Mac のコンソールに出力されます。これはシェーダ開発者のデバッグ プロセスに役立ちます。
各シェーダ インスタンスのプリ/ポスト コールバック関数を指定することができます。これは、たとえば、現在の図面のコンテキストに基づいてパラメータを更新する場合などに便利です。 MShaderInstance::DrawCallback インタフェースから、カスタム コールバックを派生させることもできます。
パラメータは、コールバックの内側または外側のいずれかにいつでも設定できます。サポートされているパラメータ タイプには、ブール、整数、浮動小数点のタプル、行列、テクスチャとテクスチャ サンプラ、レンダー ターゲットがあります。パラメータを更新するための一般的な操作は、パラメータ リストを照会し、次に必要なパラメータに対して MShaderInstance 上の適切なメソッドを使用して値を設定します。
パラメータに関連付けられているセマンティックも照会することができます。 一般的に、システム定義のセマンティックを持つパラメータはすべて自動的に更新されます。これには object-to-world 行列などのユニフォームが含まれます。サポートされるセマンティックのリストについては、「}ビューポート 2.0 でサポートされるシェーダのセマンティック」を参照してください。
MShaderInstance::requiredVertexBuffers() メソッドを使用すると、指定したシェーダ インスタンスの頂点バッファ記述子のリスト(MVertexBufferDescriptorList)を照会できます。特に、サブシーン オーバーライドは、カスタムのレンダー アイテムにシェーダ インスタンスを使用する際にこのメソッドを利用できますが、このメソッドはこのオーバーライドのコンテキスト外で呼び出すことができます。
シェーディングとレンダリング ジオメトリの間には自然な分離があります。このため、変更パラメータ(ジオメトリ アトリビュート)は、シェーダ パラメータとして公開されていません。パイプラインのレンダリング フェーズが自動的にジオメトリ データのバインドを処理して、レンダリング用の描画呼び出しを行います。
変更パラメータのバインドがセマンティックに依存しているため、カスタムのエフェクトはすべて、変更パラメータ用の適切なセマンティック タグで記述される必要があります。下記にサンプルの頂点シェーダ入力構造を示します。位置および法線の要件タグが記述されています。
struct VS_INPUT { float4 Pos : POSITION; // Position semantic to bind positional data streams float4 Norm : NORMAL; // Normal semantic to bind normal data streams };
シェーダ インスタンスの統合の一部として、インスタンスは任意の透明度で描画するかどうかを指定することができます。 これは、パイプラインの流れの中で、レンダー項目(MRenderItems)の分類に役立ちます。
「シェーダ」の代わりに、MShaderInstance インスタンスは、MRenderItem によって参照されます。MShaderInstance で表現されるシェーダのジオメトリ アトリビュートは、頂点記述とインデックス記述のセットを提供し、これにより更新時に使用される要件が指定されます。
更新フェーズと描画フェーズが存在するパイプラインは次のようになります。
上記の図では、前の図にあった抽象的な構成要素の一部は、API で公開される構成要素に置き換えられています。更新フェーズでは MRenderItems (および、それらに関連付けられた MShaderInstances)を生成します。レンダー項目が「透明度」レンダー項目リストに転送されるようにするために、MShaderInstance 上の透明度インジケータは、統合フェーズおよび分類フェーズ中に考慮されます。描画フェーズ中に、MRenderItem が検査されます。 対応する MShaderInstance はシェーダを設定し、MShaderInstance のパラメータ値に基づいて実際のハードウェア シェーダを更新します。MGeometry 内で参照されるジオメトリはバインド、描画されます。 MShaderInstance に関連付けられたすべてのプリ/ポスト コールバックは、適切な時間に呼び出されます。
固定関数のマテリアル設定に使用される古いインタフェースが 1 つ存在します。これは MMaterial インタフェースといい、UI DAG オブジェクト インタフェース(MPxSurfaceShapeUI)と連携して使用されます。プログラマブル シェーダと固定関数の古い描画フレームワークとの混合はないので、MShaderInstance と UI オブジェクトの間には何も接続がありません。
レンダー項目に割り当てられたシェーダ インスタンスは、統合に影響する場合があります。異なるシェーダ インスタンスは、関連するレンダー項目の間で統合が起こらないことを意味します。
シェーダ インスタンスを使用する場合、プラグインでは、独自の設定の数を最小限に保つ必要があります。たとえば、2 つのカラー シェーダが必要な場合、プラグインでは、同じシェーダの定義を使用し、異なるパラメータ値(カラー)を使用する 2 つのシェーダ インスタンスを保持できます。逆に、プラグインでは、同じシェーダ パラメータを持つ 2 つのシェーダを保持してはいけません。