ハードウェア シェーダ
以下は、ハードウェア シェーダ プラグイン製作者向けのコーディングのヒントです。
- 必要のない場合は、すべての GL アトリビュートをプッシュしたりポップしたりしないようにします。特定のアトリビュートをプッシュするよりもリソースを消費する操作になるからです。
- シーン ビュー内でハードウェア シェーダのみを使用している場合は、旧 API の geometry()、bind() および unbind() の使用をお勧めします。ハードウェア シェーダのバッチ レンダリングも行う場合は、新しい API の
glGeometry、glBind および glUnbind の使用をお勧めします。
- すべてのノード アトリビュートを、内部的にキャッシュすることをお勧めします。hwColorPerVertex、hwPhongShader および cgFxShader などは、すべて内部キャッシュを行います。キャッシュされていない値は、評価する際にリソースを大量に消費し、作成にかかる時間が倍増します。
- 複雑なアトリビュート(構造体や配列)を使用しないようにします。
- シェーダ上に出力されるカラーが重要ではない場合は、どのアトリビュートもそれに作用しないようにします。アトリビュートが作用すると、あるアトリビュートをダーティにしたときに従属するアトリビュートを派生させるための再計算が行われるため、余分な計算が発生するからです。
- 必要が無い場合は、compute() メソッドを空にしておくことが可能です。メソッドが単純であるほど、パフォーマンスが向上します。出力カラーを計算しなければ、スウォッチは表示されません。
- プラグイン内で、接線を処理後に正規化しないようにします。これは自動的に行われます。
- ジオメトリ コールを経由して送信されたデータは読み取り専用で、内部的にキャッシュされます。この値は変更しないでください。
- 単純なデータには(Maya API オブジェクトに代わって)単純なデータ構造を使用します。たとえば、MFloatVector ではなく float3 を使用します。OpenMaya で使用されるインタフェースにより、パフォーマンスが大幅に向上します。
- M3dView 上で使用可能なメソッドを活用します。OpenGL の状態は内部的にキャッシュされ、beginGL() や endGL() を使用したり、OpenGL への直接コールを行うよりもパフォーマンスが向上します。
- 描画は、glDrawRangeElements を使って行います。これは、ハードウェア シェーダに渡されるジオメトリ配列を使用して描画を行うためのカード ベンダ推奨 API です。
- hasTransparency() の戻り値が正しく設定されているかを確認します。true に設定すると、Maya はオブジェクトを 2 回描画します(1 回目はフロント フェースのカリング、2 回目はバックのカリング)。
- M3dView での現在の表示状態を考慮します。たとえば、表示モードがの場合は、ライティングを無効にしないでください。
- 透明度が有効になっていれば、フレーム バッファのブレンドは既に有効になっています。改めて有効にする必要はありません。
- メソッド MPxHwShaderNode::currentPath() を利用し、アトリビュートの検索メソッド(たとえば、getTexCoordSetNames())に適切な情報を送信します。
- カラー/アルファ値および深度マスクのパラメータのうち、どれがインタラクティブになっているか、特にハードウェア レンダリングの設定をテストします。これにより、より単純なバージョンのジオメトリを描画する方法についてのヒントが得られます。
- ハードウェア レンダラの場合、プラグインは複数回コールすることが可能です。通常、一般的なコールの順序は次のとおりです:深度パス、[ライティング パス[複数可]]、カラー パス、[シャドウ マップ パス]、[アルファ値パス]、[深度パス]。中カッコ「[」と「]」で示す項目はオプションで、シーン内のライト数、ライトのシャドウが有効になっているかどうか、アルファ値と深度の出力イメージがレンダー設定(Render
Settings)で指定されているかどうかによって異なります。
- オブジェクト(NURBS またはポリゴン サーフェス)ごとに使用可能な、オプションを使用します。これは、のセクションで、またはメニューのオプションとして使用できるようになっています。でオブジェクト上にハードウェア シェーダが表示されないようにしたり、でシェーダ表示を既定値に戻したりします。これにより、プラグインのユーザは、パフォーマンスを向上させるためにシェーダの表示を必要に応じて無効にすることができます。