GLSLシェーダプログラム
Cg/HSL シェーダプログラム の使用に加えて,OpenGLシェーダ言語(GLSL)のシェーダも直接記述することが出来ます。
しかし 直接的なGLSLはテスト目的のみが推奨 で,この他では確実にMac OS XあるいはOpenGL ES 2.0互換モバイルデバイスを使用する場合のみ使用すべきです。通常のケースの大部分では,UnityはCg/HLSLを最適化されたGLSLにクロスコンパイルします(これyはモバイルプラットフォームではデフォルトで行われ,デスクトッププラットフォームでは #pragma glsl
を通して任意で有効に出来ます)。
GLSLプログラムスニペットは GLSLPROGRAM
と ENDGLSL
キーワードの間に記述します。
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