ShaderLab は単なるハードウェアシェーダー以上の機能を含み、さまざまなことができます。まず、Properties(プロパティー:属性)はマテリアルのインスペクターに表示するものや、違うグラフィックスハードで動けるように複数のシェーダーを含んだり、ハードが用意した固定関数を調整したり、などなどです。実際のプログラマブルシェーダー(頂点シェーダーや Fragment シェーダーのプログラムのような)は ShaderLab のシェーダーのコンセプトの単なる一部です。シェーダー: 頂点とフラグメントプログラム で基本的な説明をします。ここではローレベルなハードに近いシェーダーを __shader programs__と呼ぶことにします。
もしライティングに反応するシェーダーを書きたいなら、サーフェスシェーダーの記述 を読んでください。 またサンプルをお探しの場合は、頂点とフラグメントシェーダーの例 を参照してください。ここでは、Unity のライトで反応しないシェーダーについて言及します。(例:スペシャルエフェクト、イメージエフェクト 等)
シェーダープログラムは Cg / HLSL 言語で書かれています。シェーダーテキストの Pass コマンドの中に「スニペット」が埋め込まれます。だいたい以下のような感じになります。
Pass {
// ... the usual pass state setup ...
CGPROGRAM
// compilation directives for this snippet, e.g.:
#pragma vertex vert
#pragma fragment frag
// the Cg/HLSL code itself
ENDCG
// ... the rest of pass setup ...
}
Cg/HLSL プログラムスニペットは CGPROGRAM と ENDCG 間に書かれます。
まずは #pragma ステートメントで始まります。ここの命令はコンパイルするため、どんなシェーダー関数なのかを指し示しています。
その他のコンパイル命令
それぞれのスニペットには最低でも頂点プログラムとフラグメントプログラムが含まれていなければいけません。それゆえに #pragma vertex と #pragma fragment 命令が必要になります。
Unity 5.0 上で実行しても何も起こらないコンパイル命令で、安全に削除できるもの: #pragma glsl
, #pragma glsl_no_auto_normalization
, #pragma profileoption
, #pragma fragmentoption
Unity はいくつかのレンダリング API (すなわち Direct3D 9 と OpenGL )をサポートし、デフォルトですべてのシェーダープログラムはサポートされているレンダラーにコンパイルされます。どのレンダラーにコンパイルするかは #pragma only_renderers あるいは #pragma exclude_renderers ディレクティブで指定できます。これは、特定のシェーダーがあるレンダラーでしか使用できず他では使用できない場合に便利です。現在サポートされているレンダラーの名前は以下のとおりです。
例えば、次の行は、シェーダーを D3D9 モードでのみコンパイルします。
#pragma only_renderers d3d9