Unity のすべてのファイルシェーダーは、「ShaderLab」という宣言型言語で記述されています。
ファイルの nested-braces シンタックスは、シェーダーで記述する式や値などさまざまなものを宣言を行います。例えば、シェーダーのプロパティーはマテリアルインスペクター上に表示されるはずです。
ハードウェアのフォールバックを行う種類や、使用するブレンドモードなどが表示されます。
また、実際の「シェーダーコード」は、同一ファイル内の CGPROGRAM
スニペットで記述しています(サーフェイスシェーダー および 頂点シェーダーと Fragment シェーダーのプログラミング参照).
本ページと子オブジェクトのページでは、nested-braces “ShaderLab” シンタックスを説明しています。
CGPROGRAM
スニペットは、通常 HLSL/Cg で記述しています。頂点シェーダーと Fragment シェーダーのプログラミング 参照してください。
Shader はシェーダーファイルのルートコマンドです。すべてのファイルは必ずひとつのシェーダーのみを定義しないといけません。このシェーダーを使用するマテリアルをもつオブジェクトがレンダリングされる方法を示します。
Shader "name" { [Properties] Subshaders [Fallback] [CustomEditor] }
シェーダーを定義します。マテリアルインスペクターに表示されるか name 以下でリストに記述されます。シェーダーは任意のオプションとして、マテリアル設定として表示される Properties の一覧として定義できます。サブシェーダーのリストが来た後、オプションとしてフォールバック、カスタムエディターの宣言を両方、またはどちらか一方を行います。
シェーダーは Properties のリストをもつことができます。シェーダーで定義されたプロパティーは Unity の マテリアルインスペクター で表示されます。通常のプロパティーは、オブジェクトのカラー、テクスチャ、シェーダーにより使用される任意の値です。
各シェーダーは SubShader のリストから構成されます。少なくともひとつが必要です。シェーダーをロードするとき、Unity はサブシェーダーのリストから、エンドユーザーのマシンでサポートされる最初のサブシェーダーを選択します。もしサポートされるサブシェーダーがない場合、Unity は Fallback シェーダー の使用を試みます。
異なるグラフィックスカードは異なる性能を持ちます。このためゲーム開発者は、最新のハードウェアで最高のビジュアルを実現したいですが、「人口の3%にしか提供できないようにはしたくない」、という永遠の課題に悩まされます。サブシェーダーはこのときに活躍します。夢に描いたグラフィックス効果を、思いつく限りすべて盛り込んだサブシェーダーを1つ作り、古いグラフィックスカード向けには、別のサブシェーダーを追加します。それらのサブシェーダーでは、エフェクトをより遅く実行したり、詳細を省くように設定することができます。
シェーダーの “level of detail” (LOD) と、“shader replacement” の2つもまた、サブシェーダーの作成に使用できるテクニックです。詳細は シェーダー LOD と Shader Replacemementを参照してください。
考えられるもっともシンプルなシェーダーの例:
// 色付けされた頂点ライティング
Shader "Simple colored lighting"
{
// 1 つのカラープロパティー
Properties {
_Color ("Main Color", Color) = (1,.5,.5,1)
}
// 1 つのサブシェーダーを定義します
SubShader
{
// サブシェーダーの 1 つの Pass
Pass
{
// 固定関数頂点ライティングを使用
Material
{
Diffuse [_Color]
}
Lighting On
}
}
}
このシェーダーでは color プロパティーとして _Color (マテリアルインスペクターで Main Color として表示)を、デフォルト値 (1, 0.5, 0.5, 1) として、定義します。次にひとつのサブシェーダーを定義します。サブシェーダーはひとつの Pass から構成され、固定関数頂点ライティングを有効にして、自身の基本マテリアルを設定します。
さらに複雑なサンプルは サーフェイスシェーダーの例 や 頂点とフラグメントシェーダーの例を参照してください。