HLSL シェーダープログラム を作成するだけでなく、生の OpenGL Shading Language(GLSL) シェーダープログラムを Unity で作成することもできます。
ノート: これは通常のワークフローの一部としては推奨されておらず、必要とされていません。Unity は必要に応じて、HLSL を最適化された GLSL にクロスコンパイルします。Raw の GLSL の使用は、テストや、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; // 頂点シェーダーがこれを計算し、フラグメントシェーダーが使用します。
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);