ShaderLab シェーダーは単なるハードウェアシェーダー以上の機能を含み、さまざまなことができます。ShaderLab シェーダーは Material インスペクターに表示されたプロパティーの記述、さまざまなグラフィックスハードウェア用の複数のシェーダーの実装、固定関数のハードウェア状態の設定などを行います。実際のプログラマブルシェーダー (頂点シェーダーやフラグメントシェーダーのプログラムなど) は ShaderLab のシェーダーのコンセプトの単なる一部です。導入的な説明は、シェーダー: 頂点とフラグメントプログラム を参照してください。ここでは低レベルなハードウェアシェーダーを シェーダープログラム と呼ぶことにします。
ライティングと相互作用するシェーダーを作成する場合は、サーフェスシェーダー のドキュメントを参照してください。いくつか例を見るには 頂点シェーダーとフラグメントシェーダーの例 を参照してください。このページの残りの部分は、シェーダーが Unity のライト (例えば、特殊効果、ポストプロセスエフェクト など) と相互作用しないことを前提としています。
シェーダープログラムは HLSL 言語 で記述され、シェーダーテキストに “スニペット” を埋め込んで Pass コマンドの任意の場所に置かれます。 通常は以下のようになります。
Pass {
// ...通常の pass 設定...
CGPROGRAM
// このスニペットのコンパイラーディレクティブ。例:
#pragma vertex vert
#pragma fragment frag
// the Cg/HLSL code itself
ENDCG
// ... pass 設定の残り ...
}
HLSL プログラムスニペットは CGPROGRAM と ENDCG のキーワードの間、または、HLSLPROGRAM と ENDHLSL の間に記述します。2 番目の形式では、自動的には HLSLSupport と UnityShaderVariables ビルトインヘッダーファイル は 含まれません 。
スニペットの開始で、コンパイラーディレクティブは #pragma ステートメントではじまります。ディレクティブはどのシェーダー関数を使ってコンパイルするかを示します。
その他のコンパイラーディレクティブ
それぞれのスニペットには最低でも頂点プログラムとフラグメントプログラムが含まれていなければいけません。それゆえに #pragma vertex と #pragma fragment 命令が必要になります。
Unity 5.0 上で実行しても何も起こらないコンパイル命令で、安全に削除できるもの: #pragma glsl
, #pragma glsl_no_auto_normalization
, #pragma profileoption
, #pragma fragmentoption
Unity はいくつかのレンダリング API (例えば Direct3D 11 と OpenGL) をサポートしており、デフォルトではすべてのシェーダープログラムは、サポートされているすべてのレンダラーにコンパイルされます。#pragma only_renderers または #pragma exclude_renderers ディレクティブを使用してどのレンダラーをコンパイルするかを指定できます。これは、一部のプラットフォームでは使用不可であることが分かっているシェーダー言語の機能を、明示的に使用する場合に最も役立ちます。サポートされているレンダラー名は以下のとおりです。
例えば、次の行は、シェーダーを D3D11 モードにのみコンパイルします。
#pragma only_renderers d3d11