頂点シェーダおよびフラグメント シェーダのロードに ogsfx ファイルで include コマンドを使用する

頂点シェーダおよびフラグメント シェーダのロードに .ogsfx ファイルで #include コマンドを使用する例は、Maya のインストール の presets¥GLSL¥examples フォルダにあります。

#include コマンドを使用することで、すべてを 1 つの .ogsfx ファイルに結合する必要なく、既存の GLSL シェーダ コードを保持することができます。これにより、さまざまなアプリケーション間で同じ GLSL フラグメントを共有できます。

例は、次のファイルで構成されます。

均一の定義

.ogsfx ファイルは、uniform パラメータの定義ではじまります。

HIDE_OGSFX_UNIFORMS を 0 に設定し、#include コマンドを使用して Brix.glslf および Brix.glslv シェーダ ファイルを読み込みます。

#if! HIDE_OGSFX_UNIFORMS#endif で囲まれている Brix.glslf および Brix.glslv シェーダ ファイル内のコードが、(プリプロセッサによって)展開された中間一時ファイル .ogsfx に挿入され、コンパイルされます。この一時的な .ogsfx ファイルは、オリジナルの .ogsfx ファイルが完全に前処理された後にのみ、コンパイルされます。

#if! HIDE_OGSFX_UNIFORMS#endif ラッパーで囲まれた #if OGSFX#endif ステートメントは、OGSFX 固有コードのラップに使用されます。

GLSL を使用する他のサードパーティ アプリケーションの均一を定義するには、#if#endif ラッパー内で #else を使用します。

OGSFX の均一の定義で、World や WorldInverseTranspose などのセマンティックは、均一の意味を Maya に示すために使用します。

例:

uniform mat4 gWorldITXf : WorldInverseTranspose < string UIWidget="None"; >;

gWorldITXf は World トランスフォーム情報を含む matrix 4 であり、反転され、位置変更されることを Maya に示しています。

Maya のビューポート 2.0 でサポートされるセマンティックのリストについては、『Maya 開発者ヘルプ』の「ビューポート 2.0 API」セクションの「ビューポート 2.0 でサポートされるシェーダのセマンティック」を参照してください。

DIRECTION や AMBIENT などのライト固有のセマンティックでは、Maya によってライトをドリブンできます。たとえば、AMBIENT では、Maya の アトリビュート エディタ(Attribute Editor)のアンビエント ライト カラーを設定することができます。

ビューポート 2.0 の dx11Shader プラグインによってサポートされるセマンティックと注釈」に記載されているすべてのセマンティックは、Maya の GLSL シェーダによってサポートされます。

入力および出力ストリームの定義

.ogsfx ファイルでは、次に、入力および出力ストリームを定義します。

HIDE_OGSFX_STREAMS を 0 に設定し、#include コマンドを使用して Brix.glslf および Brix.glslv シェーダ ファイルを読み込みます。

#if !HIDE_OGSFX_STREAMS#endif で囲まれている頂点シェーダ ファイルおよびフラグメント シェーダ ファイルのコードがコンパイルされます。

ここでも、#if! HIDE_OGSFX_STREAMS#endif ラッパーで囲まれた、#if OGSFX#endif ステートメントは、OGSFX 固有コードのラップに使用されます。

頂点シェーダおよびフラグメント シェーダの main 関数を実装する

次に、.ogsfx ファイルでは、頂点シェーダおよびフラグメント シェーダの main () 関数を実装します。

HIDE_OGSFX_CODE を 0 に設定し、#include コマンドを使用してそれぞれの GLSLShader ブロック内に頂点シェーダおよびフラグメント シェーダをロードします。たとえば、次のようになります。

GLSLShader VS
{
#include "Brix.glslv"
}

#if! HIDE_OGSFX_CODE#endif ステートメントで囲まれている頂点シェーダおよびフラグメント シェーダの main() 関数がコンパイルされます。main() 関数は 1 つのみにする必要がありますが、main() でその他の関数を定義し、呼び出すことができます。

テクニックの定義

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

複数のテクニックを指定でき、複数の頂点シェーダや複数のフラグメント シェーダがある場合は、それぞれのテクニックで使用するシェーダを指定することができます。この例では、1 つの主要なテクニックのみを定義しています。

コードの処理セクションで、Brix.glslv がロードされ、VS として定義されました。

GLSLShader VS
{
#include "Brix.glslv"
}

ここで、VS はテクニックの定義内で、同じ頂点シェーダ ファイルの識別に使用されます。

VertexShader (in appdata, out brixVertexOutput) = VS;

リストされ、指定した頂点シェーダおよびフラグメント シェーダを指定している入力および出力パラメータと、頂点シェーダ ファイルおよびフラグメント シェーダ ファイル内で定義されたパラメータを一致させます。

たとえば、Brix.glslv には、appdata という名前の一致する入力と brixVertexOutput という名前の一致する出力が存在する必要があります。

VertexShader (in appdata, out brixVertexOutput) = VS;