カスタム GLSL シェーダを作成する: テクスチャリング、透明度、ライティング、ハードウェア選択の例

GLSL シェーディング言語の仕様には、CgFX または HLSL で可能なように、単一のエフェクト ファイルにさまざまなシェーダ フラグメントとそれに関連付けられた UI を接続できる記述が含まれていません。

このため、ライトとテクスチャのバインドの処理、アトリビュート エディタ(Attribute Editor)でのパラメータの表示方法の決定などのさまざまなシェーディング段階で GLSL フラグメントを指定できるラッパー ファイル フォーマットが利用できます。このファイル フォーマット、.ogsfx は以下で説明しています。

カスタム GLSL シェーダを作成するには、.ogsfx ファイルとして保存します。GLSL シェーダの作成方法の例については、Maya インストールの ..¥presets¥GLSL¥examples フォルダにある WaterSimulation.ogsfx エフェクトを参照してください。

この例では以下を示します。

この例を視覚化するには、立方体を作成して、polyCube ノードアトリビュート エディタ(Attribute Editor)から幅の分割数(Subdivisions Width)および深度の分割数(Subdivisions Depth)を 100 に増やします。シェーディングおよびテクスチャ表示モードの場合は[6]キーを押します。

立方体に GLSL シェーダを割り当て、WaterSimulation.ogsfx エフェクト ファイルにナビゲートします。詳細については、「GLSL シェーダを作成および視覚化する」を参照してください。

このサンプル シェーダは、シーン内の 1 つの Maya ライトに反応できるアニメートされた波を作成します。これは高さおよび法線マップに接続され、透明度が表示できます。

このシェーダの例で使用されているセマンティックと注釈の詳細については、「ビューポート 2.0 の dx11Shader および glslShader プラグインでサポートされるセマンティックと注釈」および「ビューポート 2.0 でサポートされるシェーダ セマンティック」を参照してください。

テクスチャ ファイルを指定するには

ファイル テクスチャを定義するには、次の例に従ってください。

uniform texture2D gHeightMap  <
    //Specify the texture file to be loaded by default
    string ResourceName = "SeaHeightMap.jpg";

    //Specify the type of texture
    string ResourceType = "2D";
    //Name of field in Attribute Editor
    string UIName = "Sea Height Map";
   
    int mipmaplevels = 0;
>;
uniform sampler2D gHeightMapSamp = sampler_state
{
    texture = <gHeightMap>;
};

サンプリングは gHeightMapSamp で実行され、ファイル テクスチャは gHeightMap にロードされます。sampler_state により、サンプラに外部テクスチャを関連付けることができます。

ResourceName 注釈により、シェーダがロードされたときに、指定したテクスチャ ファイルを自動的に接続してロードすることができます。たとえば、この例では、SeaHeightMap.jpg ファイルが接続されています。そうでない場合、ユーザはファイル ノードを作成し、それをアトリビュートに接続する必要があります。

この場合、SeaHeightMap.jpg ファイルは WaterSimulation.ogsfx ファイルと同じフォルダにあります。テクスチャ ファイルが別のフォルダにある場合、フル パスを指定する必要があります。

Maya のアトリビュート エディタ(Attribute Editor)でアトリビュートを作成するには

ユニフォームは Maya のアトリビュート エディタ(Attribute Editor)でその変数とともに自動的に表示されます。ユニフォームに分かりやすい名前を付けるには、UIName 注釈を使用します。

例:

uniform texture2D gHeightMap  <
...
... 
  string UIName = "Sea Height Map";
...
>;

海の高さマップ(Sea Height Map)が GLSLShader ノードのアトリビュート エディタ(Attribute Editor)に gHeightMap の代わりにアトリビュートとして表示されます。

ユニフォームをアトリビュート エディタ(Attribute Editor)に表示しない場合、次の注釈を使用します。

string UIWidget = "None";

テクニックを追加するには

テクニックには 1 つまたは複数のパスを含めることができ、それぞれのパスはオブジェクトをレンダリングする特定の方法を定義します。複数の頂点シェーダ、複数のジオメトリ シェーダ、複数のピクセル シェーダがある場合、各テクニック/パスでどのシェーダを使用するかを指定できます。

この例では、1 つのパスを含む technique Main により PS_Wave ピクセル シェーダが使用されるように指定されています。GLSLShader ノードのアトリビュート エディタ(Attribute Editor)で Main をテクニックとして選択すると、波がビューポートにレンダーされます。

同様に、1 つのパスを含む technique NormalView により PS_Normal ピクセル シェーダが使用されるように指定されています。アトリビュート エディタ(Attribute Editor)で NormalView を選択すると、波の法線マップがビューポートに表示されます。

テクニック NormalView_Selection には 7 つのパスが含まれ、それぞれのパスには異なる頂点シェーダ、ジオメトリ シェーダ、ピクセル シェーダが使われています。このテクニックは、ハードウェア選択を説明します。詳細については、「ディスプレイスされたコンポーネントを選択して描画するには」を参照してください。

透明度を表示するには

オブジェクトが透明度を表示できるようにするには、テクニックを指定するときに Transparency テクニック注釈を使用します。

次の例では、GLSLShader アトリビュート エディタ(Attribute Editor)で Main テクニックが選択されている場合にオブジェクトが透明度を表示します。

technique Main
<
//tell Maya to support transparency for this technique
string Transparency = "Transparent";
>

シェーダにシーンのライトを割り当てるには

サンプル エフェクトの Light 0 Group セクションでは、シーンのいずれかのライトを GLSL シェーダに割り当てる方法と、ライト パラメータがどのようにシェーダに影響するかを示しています。

シェーダ計算に複数のライトを含める場合、エフェクト シェーダ内に追加の Light 1、Light 2 (など)のセクションを作成します。また、ライトが互いにどのように作用するかをプログラムする必要があります。

シェーダにライトを追加するには、3 つの方法があります。以下のことができます。

この最初の 2 つのいずれかのオプションを選択した場合、ライトのバインドを行った後で、GLSLShader のアトリビュート エディタ(Attribute Editor)のライトのパラメータを変更することはできなくなります。代わりに、ライトのアトリビュート エディタ(Attribute Editor)で変更する必要があります。

シーン ライトの影響を確認するには、Maya ビューポート パネル メニューでライティング > すべてのライトの使用(Lighting > Use All Lights)を選択します。

注: この例では、ライティングは PS_Wave ピクセル シェーダのみで定義され、これはメイン(Main)テクニックのみで使用されます。したがって、テクニックとしてメイン(Main)を選択した場合は、ビューポート 2.0 (Viewport 2.0)のみでこのライティング エフェクトを確認することができます。

統合を無効にするには

GLSL シェーダが適用されたジオメトリの統合ワールド(Consolidate World)機能を無効にするには、テクニック注釈 handlesConsolidatedGeometry を false に設定します。

string handlesConsolidatedGeometry = "false";

この注釈は、ワールド変換行列の使用など、オブジェクトのオブジェクト空間座標を含む計算といったテクニックでディスプレイスメントを描画する場合に役立ちます。統合ワールド(Consolidate World)では複数のオブジェクトの頂点が新しく共有するオブジェクト空間に移動されるため、結果としてプラグイン シェーダが不適切にレンダーされる場合があります。この場合、統合ワールド(Consolidate World)を無効にすることができます。

ディスプレイスされたコンポーネントを選択して描画するには

NormalView_Selection のテクニックは、ディスプレイスされたコンポーネントでハードウェア選択を実行する方法と、マテリアルではない項目(ワイヤフレームや選択されたエッジ/頂点など)をそのディスプレイスされた位置でレンダリングする方法を示します。

ハードウェア選択により、テッセレーションされたジオメトリを選択することができます。さらに、ワイヤフレームやコンポーネントは、ビューポートのシェーディング マテリアルと同じ輪郭を描画します。このテクニックには、7 つの異なるパスがあります。

このテクニックを定義する前に、#include 命令を使って以下の 4 つのシェーダをロードします。#include 命令により、異なるアプリケーション間で同じ GLSL フラグメントを共有することができます。また、個別のシェーダ コード ファイルとして保持できるため、1 つの .ogsfx ファイルにすべてを統合する必要はありません。

GS_FatLine.ogsfh:線分を長方形に変換するジオメトリ シェーダで、レンダリングする線を太く描画することができます(たとえば、事前選択されたハイライト エッジをアクティブになっていないエッジよりも太く表示できます)。

GS_FatPoint.ogsfh:点を四角形に変換するジオメトリ シェーダで、レンダリング する点を大きく描画することができます(たとえば、頂点が単一のピクセルではなく正方形でレンダリングされます)。

PS_SolidColor.ogsfh:ソリッド カラーで描画するピクセル シェーダです。

PS_HWSelection.ogsfh:ハードウェア選択が行われているときにコンポーネントをレンダリングするピクセル シェーダで、それぞれのコンポーネントはオブジェクト ID またはコンポーネント ID を使って計算された異なるソリッド カラーでレンダリングされます。

ビューポートでの描画には最初の 4 つのパスが使われます。つまり、PS_Normal および PS_SolidColor ピクセル シェーダが使われます。

最後の 3 つは、ハードウェア選択が行われているときにコンポーネントをレンダリングするのに使われます。つまり、PS_HWSelection ピクセル シェーダが使われます。PS_SolidColor ピクセル シェーダは使用されません。これらのパスがビューポートでの描画に使われないためです。

選択されたオブジェクトの識別には、プリミティブ ID (たとえば、頂点 ID)を使って色を生成します。オフスクリーン バッファを使ってこれらの計算されたカラーを格納し、マウスで何が選択されたかを Maya に伝えます。

テクニックとパス注釈

overridesNonMaterialItems テクニック注釈は、ワイヤフレーム、あるいはエッジや頂点コンポーネントなどのマテリアルではない項目をレンダリングするのに使用できるテクニックを指定します。

string overridesNonMaterialItems = "true";

パス注釈は、どのレンダリング項目にどのパスを使用するのかをプラグインに伝えるのに使われます。

例:

pass pNonMaterialItemsFatLine
<
// This pass will be used to render non material items as fat lines
string drawContext = "nonMaterialItemsPass";
string primitiveFilter = "fatLine";
>

つまり、レンダリング項目がマテリアルではない項目であると分類され、プリミティブ タイプが太い線であると分類された場合は、pNonMaterialItemsFatLine パスが使われます。

これらのパス注釈に関する詳細は、「サポートされるパス注釈」を参照してください。

OverrideNonMaterialItems に関する詳細は、『Maya 開発者ヘルプ』にある「MRenderItem::RenderItemType」を参照してください。