SLI Zone

NVIDIA.com Gelato Zone Home
 
Download the free version

Mangoの動作: シェーダーコール
  — ジョン・シュラグ

Mangoは、これまで見たことのない2つの方法でシェーダーを処理できます。 Mangoでは、カスタムシェーダーを使用できるだけではありません。 Mayaシェーダーの実装を追加することもできます。

Mangoでカスタムシェーダーを使用するには、ユーザーズマニュアルのシェーダーを無効にするを参照してください。 手短に言うと、これにはMayaの内蔵式シェーダーの代わりに、または一緒に、GSLに書き込まれたGelatoシェーダーを使用する方法が示されています。

第2のポイント(Mayaシェーダーの実装)に関して、この使用を勧める2つの理由があります。 1つは、MangoはMayaのシェーダーに一致するシェーダーと一緒に出荷されていますが、一部ないものもあります。 そのギャップの1つを自分で埋めることができます。 (その場合、当社にお知らせください。 その後のリリースの一部として、新しいシェーダを含めることも考慮しています)。 もう1つは、あなたまたは他の誰かがこれまでのMangoにはなかったMayaシェーダープラグインを書き込むことができます。 Gelatoでこの新しいシェーダーレンダリングを得るには、GSLおよびDSOシェーダーをいくつか組み合わせる必要があります。

これがすべてどう機能するかを理解するために、一歩退いてMangoがシェーダーを処理する方法に注目しましょう。

Mangoの設計概要の一部は、内蔵型Mayaシェーダー、およびユーザーがGSLに書き込むすべてのカスタムシェーダーの両方を処理する必要があるということです。 その要件を前提として、Mango 以下を実行する必要があります。

  • 任意のシェーダー.gsoファイルを開く(当社またはユーザー)
  • シェーダーのパラメータのリストの取得
  • Mayaノードに一致する属性の検出
  • 非接続属性の値の書き込み(アニメまたは非アニメ)
  • 最後に、「アップストリーム」テクスチャへの接続を通して追跡し、それと同じことを実行します。

もちろん、MangoはカスタムシェーダーパラメータのU.I.アイテムをAttribute Editor(属性エディタ)にも追加します。 これにより、カスタムシェーダーは内蔵式シェーダーとまったく同じに見えます。 パラメータを編修し、Mayaで行っていたようにそれをアニメート化しテクスチャ加工することができます。

Mangoにはカスタムシェーダーに対してこれをすべて行う必要があるため、内蔵式シェーダーの処理にも同じコードを使用することは意味があることでした。 従って、以下は重要なポイントです: MangoプラグインはMayaの内蔵式シェーダーについてほとんど何も知らない。 これは奇妙に聞こえるかもしれませんが、真実です。MangoのMayaエミュレーションシェーダーはGSLに書き込まれているため、ユーザーが書き込むすべてのカスタムシェーダーと同じ同じ基盤上にあります。 言い換えれば、シェーダーは第1級市民です。

新しいシェーダーを書き込んだ後それがgslcに正しく準拠している場合、準拠した.gsoファイルがシェーダー検索パスのどこかにあることを確認してください("string path:shader"属性をチェックし、Gelato Render Globalsで設定します)。 Mangoはそのファイルを検索し、上で記述されたように処理します。

Mayaエミュレーションシェーダーを書き込むには、またはカスタムMayaシェーダープラグインに一致させるには、シェーダーパラメータ名がMayaシェーダーノードの属性名に一致することを確認します。

この他にも、いくつかのトリックがあります。 GelatoはMaya属性のタイプをすべて処理することはできないため、Mangoがそれをいくらか補います。

  • GSLの予約語となるパラメータ/属性名の前には、下線(_)が付けられます。 例えば、もっとも一般的なシェーダーパラメータ名の1つは、もちろん"color"です。 下がっげ、GSLパラメータ名は代わりに"_color"となります。
  • メッセージ属性は接続されたノードと共に文字列として書き込まれます。 (これは、shadingSwitchノードが機能する方法の一部です)。
  • Gelato 2.1では、GSLが可変長アレイをサポートします。 ただし、以前のバージョンから、また複合属性の一部の複雑なケースに対して、Mangoはアレイの要素へのシェーダーパラメータのマッピングをまだサポートしています。下線 (_)はドット(.)になり"_n" は "[n]"になります。 例えば、input_3_alphainput[3].alphaになります。
  • GSLにはstructがなく、Mayaの属性の一部はstructのアレイになっています。 例えば、tripleShadingSwitchのinput属性は"struct { color inTriple; string inShape; } input[]"としてGSLに書き込まれます。 代わりに、シェーダーパラメータは単に"color inTriple[]"および"string inShape[]"となります。 Mangoがアレイパラメータに一致するMaya属性を検出すると、その属性がアレイでない場合、Mangoは1つ上のレベルをチェックして親属性がアレイであるかどうかを調べます。
  • 一部のシェーダーは2つのピースで実装されます。 バージョン2.1時点でのGelatoはデマンド制御順でシェーダーを実行しますが、上位シェーダーに引数を渡すための明白なメカニズムはまだありません。 従って、例えば、maya_projectionに対してシェーダーコールを記述しているとき、Mangoはまずmaya_projection_pre.gsoを探し、上位接続を通過する前にそれに対するシェーダーコールを記述します。その後、最後にmaya_projection.gsoに対してシェーダーコールを記述します。"pre"シェーダーは一般にシェーディンググラフの他のシェーダーにより使用されるテクスチャ座標を計算します。 Mangoは、ユーザーのシェーダーに対しても"pre"シェーダーを喜んで記述します。

これはすべて、ユーザーにはMangoのMayaエミュレーションシェーダーとカスタムシェーダーのどちらか一方あるいはその両方を使用する完全な柔軟性があることを意味します。 単一のシェーディンググラフにそれらのシェーダーを混合することもできます。 実際、任意のノードを無効にできます。ノードにgelatoShader文字列属性がある場合、表面シェーダー(lambert、blinn、phongなど)だけにそのユーザーインターフェースがあります。