頂点シェーダおよびフラグメント シェーダのロードに .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 固有コードのラップに使用されます。
次に、.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;