HLSL シェーダープログラム を作成するだけでなく、Raw OpenGL Shading Language (GLSL) シェーダープログラムを Unity で作成することもできます。これは OpenGL Core と OpenGL ES プラットフォームでのみサポートされています。
注意これは、推奨されていません。また、通常のワークフローとして必要ではありません。Unity は必要に応じて、HLSL を最適化された GLSL にクロスコンパイルします。Raw GLSL の使用は、テスト目的、または特殊なユースケースでのみ推奨されています。
GLSL プログラムスニペットは GLSLPROGRAM キーワードと ENDGLSL キーワードの間に書かれます。
GLSL では、すべてのシェーダー関数のエントリーポイントは main() でなければなりません。Unity が GLSL シェーダーをロードするとき、 1 回は頂点プログラムのために VERTEX プリプロセッサー定義でソースをロードし、フラグメントプログラムのために FRAGMENT プリプロセッサー定義でもう 1 回ロードします。頂点プログラム部分とフラグメントプログラム部分を GLSL スニペットの中で分けるためには、それらを #ifdef VERTEX .. #endif と #ifdef FRAGMENT .. #endif で囲みます。それぞれの GLSL スニペットには頂点プログラムとフラグメントプログラムの両方が含まれていなければいけません。
標準的なインクルードファイルは、Cg/HLSL シェーダーのために提供されたものに一致し、.glslinc 拡張子がついています。
UnityCG.glslinc
頂点シェーダーの入力は、定義済み GLSL 変数 (gl_Vertex、gl_MultiTexCoord0 など) か、ユーザー定義の属性です。通常は、接線ベクトルのみがユーザー定義の属性を必要とします。
attribute vec4 Tangent;
頂点プログラムからフラグメントプログラムへのデータは、例えば以下のように varying 変数を通して渡されます。
varying vec3 lightDir; // vertex shader computes this, fragment shader uses this
Unity はシェーダーのコンパイル中にいくつかの前処理を行います。例えば、グラフィックス API (GlES3、GLCore) に基づいて、texture2D/texture2DProj 関数を texture/textureProj に置き換えることがあります。拡張機能の中には、新しい規則をサポートしないものがあります。特に GL_OES_EGL_image_external は重要です。
GLSL シェーダーで外部テクスチャをサンプリングする場合は、texture2D/texture2DProj ではなく textureExternal/textureProjExternal 呼び出しを使用します。
例
gl_FragData[0] = textureExternal(_MainTex, uv);