Making multiple shader program variants
ShaderLab文法:シェーダ

GLSLシェーダプログラム

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

しかし 直接的なGLSLはテスト目的のみが推奨 で,この他では確実にMac OS XあるいはOpenGL ES 2.0互換モバイルデバイスを使用する場合のみ使用すべきです。通常のケースの大部分では,UnityはCg/HLSLを最適化されたGLSLにクロスコンパイルします(これyはモバイルプラットフォームではデフォルトで行われ,デスクトッププラットフォームでは #pragma glsl を通して任意で有効に出来ます)。

GLSLスニペット

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

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

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

    UnityCG.glslinc

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

    attribute vec4 Tangent;

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

    varying vec3 lightDir; // vertex shader computes this, fragment shader uses this
Making multiple shader program variants
ShaderLab文法:シェーダ