複数のシェーダープログラムのバリアントを作る
Unityで使用するシェーダー言語

GLSL シェーダープログラム

Cg/HSL シェーダープログラム の他に、OpenGL シェーディング言語 (GLSL, OpenGL Shading Language) シェーダーも直接作成することが可能です。

ただし、生 GLSL の使用はテストの場合、または、Mac OS X、 OpenGL ES モバイルデバイス、 Linux だけを対象にするとわかっている場合にのみ推奨されます。すべての通常の場合で、Unity は必要な場合に、Cg/HLSL を最適化された GLSL にクロスコンパイルします。

GLSL スニペット

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

GLSL では、すべてのシェーダー関数のエントリーポイントは main() でなければなりません。Unity が GLSL シェーダーをロードするとき、 1 回は頂点プログラムのために VERTEX プリプロセッサー定義でソースを読み込み、フラグメントプログラムのために FRAGMENT プリプロセッサー定義でもう 1 回読み込みます。頂点プログラムとフラグメントプログラムを GLSL スニペットの中で分けるためには、それらを #ifdef VERTEX .. #endif#ifdef FRAGMENT .. #endif で囲む必要があります。各 GLSL スニペットには頂点プログラムとフラグメントプログラム両方が含まれていなければなりません。

標準的なインクルードファイルは、Cg/HLSL シェーダーのために提供されたものに一致し、.glslinc 拡張子がついています。

UnityCG.glslinc

頂点シェーダーの入力は定義済み GLSL 変数 (gl _Vertexgl_ MultiTexCoord0 など) か、ユーザー定義の属性です。通常は、接線ベクトルのみがユーザー定義の属性を必要とします。

attribute vec4 Tangent;

頂点プログラムからフラグメントプログラムへのデータは varying 変数を通して渡されます。

varying vec3 lightDir; // 頂点シェーダーがこれを計算し、フラグメントシェーダーが使用します。

外部 OES テクスチャ

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);
複数のシェーダープログラムのバリアントを作る
Unityで使用するシェーダー言語