Cg/HSL シェーダープログラム の他に、OpenGL シェーディング言語 (GLSL, OpenGL Shading Language) シェーダーも直接作成することが可能です。
ただし、生 GLSL の使用はテストの場合、または、Mac OS X、 OpenGL ES モバイルデバイス、 Linux だけを対象にするとわかっている場合にのみ推奨されます。すべての通常の場合で、Unity は必要な場合に、Cg/HLSL を最適化された GLSL にクロスコンパイルします。
GLSL プログラムスニペットは GLSLPROGRAM
と ENDGLSL
キーワードの間に記述します。
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 _Vertex
、gl_ MultiTexCoord0
、等)を元にするか、ユーザー定義された属性です。通常は接線ベクトルのみユーザー定義の属性が必要です。
attribute vec4 Tangent;
頂点プログラムからフラグメントプログラムへデータは varying 変数を使用して渡されます、例えば
varying vec3 lightDir; // 頂点シェーダーがこれを計算し、フラグメントシェーダーが使用します。
Unity はシェーダーコンパイルの間に部分的に前処理のを行います。例えば、graphics API (GlES3, GLCore) に基づいてtexture2D/texture2DProj
関数は texture/textureProj
に置き変えられます。拡張のなかには新しい規約をサポートしないものがあります。特に注目すべきは GL_OES_EGL_image_external
です。
GLSL シェーダーで外部テクスチャをサンプリングしたい場合は、texture2D/texture2DProj
の代わりに textureExternal/textureProjExternal
呼び出しを使用します。
例
gl_FragData[0] = textureExternal(_MainTex, uv);