ShaderLab は単なるハードウェアシェーダー以上の機能を含みます。たくさんのことができます。まず,Properties(プロパティ:属性)はマテリアルのインスペクターに表示するものや,違うグラフィックスハードで動けるように複数のシェーダを含んだり,ハードが用意した固定関数を調整したり,などなどです。実際のプログラマブルシェーダ(頂点シェーダーやFragmentシェーダのプログラムのような)はShaderLabのシェーダのコンセプトの単なる一部です。 シェーダ: 頂点およびフラグメント プログラム で基本的な説明をします。 ここではローレベルなハードに近いシェーダを shader programsと呼ぶことにします。
もしライティングに反応するシェーダを書きたいなら, Surface Shaders ドキュメントを読んで下さい。 またサンプルをお探しの場合は, 頂点とフラグメントシェーダの例 を参照して下さい。ここでは,Unityのライトで反応しないシェーダについて言及します。(例:スペシャルエフェクト,Image Effects 等)
Shader programs は 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 プログラムスニペットはCGPROGRAM と ENDCG間に書かれます。
まずは#pragmaステートメントで始まります。ここの命令はコンパイルするため,どんなシェーダ関数なのかを指し示しています。:
その他のコンパイル命令:
Each snippet must contain at least a vertex program and a fragment program. Thus #pragma vertex and #pragma fragment directives are required.
デフォルトでは,Unityはシェーダをおおよそシェーダモデル2.0相当にコンパイルします。#pragma target を使用することでシェーダは他のレベルにコンパイルすることが出来ます。現在は次のターゲットがサポートされています:
#pragma profileoption MaxTexIndirections=256
raises texture indirections limit to 256. Note that some shader model 3.0 features, like derivative instructions, aren’t supported by ARB_vertex_program/ARB_fragment_program. You can use #pragma glsl to translate to GLSL instead which has fewer restrictions.
3.0より大きいターゲット向けにコンパイルするとき,頂点/フラグメントプログラムともに必要です。#pragma target 4.0 - DX10シェーダーモデル4.0向けにコンパイルします。このターゲットは現在DirectX11レンダラのみでサポートされます。
#pragma target 5.0 - DX11シェーダーモデル5.0向けにコンパイルします。このターゲットは現在DirectX11レンダラのみでサポートされます。
UnityはいくつかのレンダリングAPI(すなわちDirect3D 9およびOpenGL)をサポートし,デフォルトで全てのシェーダプログラムはサポートされているレンダラにコンパイルされます。どのレンダラにコンパイルするかは#pragma only_renderersあるいは#pragma exclude_renderersディレクティブで指定できます。これはMac OS X(Direct3Dがない)のみ,Windows(UnityがデフォルトでD3Dを使用)のみ,あるいは特定のシェーダがあるレンダラでしか使用できず他では使用できない場合,に便利です。現在サポートされているレンダラの名前は:
例えば,次の行は,シェーダをD3D9モードでのみコンパイルします:
#pragma only_renderers d3d9