複数のシェーダープログラムのバリアントを作る
Unityで使用するシェーダー言語

GLSL シェーダープログラム

Cg/HSL シェーダープログラム の使用に加えて、OpenGL シェーダー言語( GLSL )のシェーダーも直接記述することができます。

しかし 直接的な GLSL はテスト目的のみが推奨 で、この他では MacOS X、OpenGL ES 互換モバイルデバイス、Linux を使用する場合のみ使用すべきです。通常のケースの大部分では、Unity は Cg/HLSL を最適化された GLSL にクロスコンパイルします。

GLSL スニペット

GLSL プログラムスニペットは GLSLPROGRAMENDGLSL キーワードの間に記述します。

GLSL では、すべてのシェーダー関数のエントリーポイントは main() と呼ぶ必要があります。Unity が GLSL シェーダーをロードするとき、頂点プログラムのために 1 回ソースを VERTEX プリプロセッセ定義でロードし、もう一回フラグメントプログラムのために FRAGMENT プリプロセッセ定義でロードします。頂点とフラグメントプログラムを GLSL スニペットの中で分離するためには、#ifdef VERTEX .. #endif and #ifdef FRAGMENT .. #endif で囲む必要があります。各 GLSL スニペットは頂点プログラムとフラグメントプログラム両方を保有する必要があります。

標準的なインクルードファイルは、Cg/HLSL シェーダーのために提供されたものをマッチングし、それらは .glslinc 拡張子がついています。 UnityCG.glslinc

UnityCG.glslinc

頂点シェーダー入力は定義済み GLSL 変数( gl _Vertexgl_ MultiTexCoord0、等)を元にするか、ユーザー定義された属性です。通常は接線ベクトルのみユーザー定義の属性が必要です。

attribute vec4 Tangent;

頂点プログラムからフラグメントプログラムへデータは varying 変数を使用して渡されます、例えば

varying vec3 lightDir; // vertex shader computes this, fragment shader uses this
複数のシェーダープログラムのバリアントを作る
Unityで使用するシェーダー言語