ハードウェア シェーディング ノード プラグインの実装
 
 
 

MPxHwShaderNode には、レンダラのハードウェア シェーディング ノード プラグインに使用できる 2 つのインタフェースが存在します。これらのインタフェースのパラメータは似ていますが、呼び出す方法が異なっています。

bind/geometry/unbind インタフェース

bind()geometry()、およびunbind() メソッドを使用すると、Maya シーン ビューでハードウェア シェーディング ノード プラグインによるレンダーが可能になります。これら 3 つのメソッドの目的は、次のとおりです。

このモードでサポートされるのはメッシュ(Mesh)シェイプだけです。描画する場合には、次の手順を使用します。

Maya の描画情報要求に対する反応は、次のとおりです。

インタフェースの仮想メソッドが呼び出される順序は、次のとおりです。

for every shape
	bind(...)
	geometry(...)
	unbind(...)

この呼び出しパターンにより、OpenGL の状態は bind() メソッドで設定され、geometry() で使用され、unbind() で復元されます。

M3dView パラメータは、このインタフェースのメソッドに渡されます。このパラメータは、描画に使用されるグラフィックス コンテキストを設定する場合に必ず使用します。仮想メソッドの機能は、beginGL() および endGL() メソッド コールを使用して、このインタフェースにまとめる必要があります。例:

MStatus hwShader::bind( const MDrawRequest& request, M3dView& view )
{
	view.beginGL();
	// Operations ...
	
	view.endGL();
}

これらのメソッドを呼び出さないと、プログラムが正常に動作しない可能性があります。

glBind/glGeometry/glUnbind インタフェース

glBind()glGeometry()、およびglUnbind()メソッドを使用すると、Maya シーン ビューでハードウェア シェーディング ノード プラグインによるレンダーが可能になります。これら 3 つのメソッドの目的は、次のとおりです。

このインタフェースで仮想メソッドが呼び出される順序は、次のとおりです。

	for every pass // a refresh may have more than one pass
	{
		for every object
		{
			if glBind() has not been called for this refresh
				glBind(...)
			glGeometry(...)
		}
	}
	for every object
		glUnbind(...)

呼び出し順序が変更されているため、考慮すべき点がいくつか存在します。このインタフェースでは、OpenGL の状態は glBind() ではなく glGeometry() で設定する必要があります。現在、glBind() が使用されるのは、リソースを読み込んで、glGeometry() で使用するアトリビュートを処理する場合だけです。

前のインタフェースと異なり、グラフィックス コンテキストは設定済みであるため、beginGL() または endGL() を呼び出す必要はありません。

geometry/glGeometry に渡される情報の制御

geometry() および glGeometry() メソッドは、大きなパラメータ リストを持っています。これには、シェーダがカレント ジオメトリをレンダーするのに必要な必須データとオプション データ(頂点とフェースのデータ)が含まれています。次のメソッドは、シェーダに渡すオプションデータを制御します。

virtual int normalsPerVertex();
virtual int colorsPerVertex();
virtual int getColorSetNames(MStringArray& names);
virtual int texCoordsPerVertex();
virtual int getTexCoordSetNames(MStringArray& names);
virtual bool provideVertexIDs();

使用できない情報を要求すると、シェーダに NULL が渡されることに注意してください。ハードウェア シェーダ プラグイン ノードは、NULL に対してパラメータ情報をテストして、データが有効であることを確認します。

透明度とハードウェア シェーダ プラグイン ノード

Maya デプスは、シェーダに透明度がある場合に描画情報をソートします。ハードウェア シェーダ プラグイン ノードが透明度をサポートしていない場合、シェーディングを実行するには、次の仮想メソッドを使用して false を返します。

virtual bool 	hasTransparency();

geometry() および glGeometry() メソッドでのインデックス付けと疎配列

データがこれらのメソッドに渡される際には、インデックス付けの仕組みが使用されます。これらのメソッドは、次のとおりです。

virtual MStatus geometry( const MDrawRequest& request, M3dView& view, int prim, unsigned int writable, int indexCount, const unsigned int * indexArray, int vertexCount, const int * vertexIDs, const float * vertexArray, int normalCount, const float ** normalArrays, int colorCount, const float ** colorArrays, int texCoordCount, const float ** texCoordArrays);
virtual MStatus glGeometry( const MDagPath& shapePath, int glPrim, unsigned int writeMask, int indexCount, const unsigned int* indexArray, int vertexCount, const int * vertexIDs, const float * vertexArray, int normalCount, const float ** normalArrays, int colorCount, const float ** colorArrays, int texCoordCount, const float ** texCoordArrays);

インデックス付けに使用されるパラメータは indexCount で、これには配列 indexArray の長さが含まれます。indexArray に含まれるインデックスは、頂点位置、カラー、および法線などの他の配列の対応するエレメントにアクセスする場合に使用されます。

配列の配列であるジオメトリのメソッドに渡されるパラメータは複数存在します。これらは、ポイントに対するポイントのパラメータです。これらの配列には NULL が含まれていても構いません。いずれかの情報要求メソッドが実際に存在する情報よりも多くの情報を要求すると、NULL が含まれる場合があります。たとえば、getTexCoordSetNames() メソッドが 3 つの UV セットを要求できるときに、1 つ目と 3 つ目の情報しか存在しない場合です。この場合、配列の配列の 2 つ目の位置は NULL になります。そのため、NULL をチェックして、データが有効であることを確認する必要があります。

ブラインド データ

ハードウェア シェーディング ノード プラグインでベイク処理された頂点メッシュのブラインド データを使用するテクニックは、レンダリングに非常に役立ちます。この方法は、両方のジオメトリ メソッドで利用できます。ハードウェア シェーディング ノード プラグインでは、provideVertexIDs() を使用して true を返す必要があります。この処理を実行すると、vertexIDs 配列に要求された情報が格納され、vertexCount に配列の長さが格納されます。MDrawRequest を使用する場合、次の方法を使用してメッシュにアクセスします。

request.multiPath().node();

インタフェースの gl バージョンを使用する場合、メッシュは shapePath パラメータで使用できます。シェイプと頂点の ID を併用すると、MFnMesh クラスを通じて頂点のブラインド データにアクセスできます。

Maya の他の部分との統合

MPxHwShaderNode クラスを使用すると、ハードウェア シェーディング ノード プラグインを Maya の他の部分と強力に統合できます。詳細については次のセクションを参照してください。

ソフトウェア レンダーとシェーダ スウォッチ(Shader Swatch)

アトリビュート エディタ(Attribute Editor)でソフトウェア レンダーとシェーダ スウォッチの適切な出力が生成されるように、ハードウェア シェーディング ノード プラグインを実行することができます。この機能では、outColor アトリビュートに作用する compute() を使用します。この方法を使うと、ソフトウェア レンダーとシェーダ スウォッチは、デフォルトの黒ではなくなります。

また、ハードウェア シェーディング ノード プラグインで特定の仮想メソッドを実行して、シェーダ スウォッチだけを描画することもできます。このメソッドを次に示します。

virtual MStatus renderSwatchImage( MImage & image );

この機能では、次のスウォッチ分類文字列が必要です。

const MString UserClassify( "shader/surface/utility/:swatch/"+swatchName );

文字列指定は、プラグインが MFnPlugin::registerNode() を呼び出すときに Maya に渡されます。

UV テクスチャ エディタ

MPxHwShaderNode には、ハードウェア シェーディング ノード プラグインを UV テクスチャ エディタ(UV Texture Editor)に統合するのに役立つメソッドがあります。これらのメソッドは、次のとおりです。

virtual MStatus getAvailableImages( const MString& uvSetName, MStringArray& imageNames);
virtual MStatus renderImage( const MString& imageName, const float region[2][2], int& imageWidth, int& imageHeight);

最初のメソッド getAvailableImages() は、UV テクスチャ エディタで利用できるようになる UV チャンネルのリストを提供します。2 番目のメソッド renderImage() は、UV テクスチャ エディタでチャンネルを選択するときに呼び出されます。その後、このルーチンが必要に応じてイメージを描画します。

ハードウェア シェーディング ノード プラグインが標準的な Maya のテクスチャを使用する場合、これらの仮想メソッドを使用する必要はありません。標準的な Maya のテクスチャは、テクスチャ エディタで利用できます。

ハイパーシェード(Hypershade)ウィンドウのアイコン

ハードウェア シェーディング ノード プラグインのアイコンを指定して、ハイパーシェード(Hypershade) ウィンドウに表示できます。アイコンを指定しない場合、デフォルトのブランク アイコンが表示されます。ハードウェア シェーディング ノード プラグインのアイコンを指定するには、次の操作を実行します。

ドラッグ & ドロップ動作

MPxDragAndDropBehavior クラスを使用すると、ハードウェア シェード ノード上でドラッグ & ドロップ動作を実装できます。MPxDragAndDropBehavior クラスは、ハイパーシェード メニューでノードのドラッグ & ドロップをサポートする多数の仮想メソッドを提供しています。ドラッグ & ドロップ動作を実装する方法については、hwPhongShaderBehavior.cpp のサンプルを参照してください。