Unity のすべての Shaders ファイルは、“ShaderLab” と呼ばれる宣言型言語で記述されています。ファイルでは、ネストされた数種のかっこを含む構文で、シェーダーを説明するさまざまなことを宣言します (例えば、マテリアルインスペクターで表示するシェーダープロパティーやハードウェアフォールバックの種類、使用するブレンドモードの種類など)。実際のシェーダーコードは、同じシェーダーファイルの CGPROGRAM
スニペットに記述されます。詳しくは、サーフェスシェーダー と 頂点シェーダーとフラグメントシェーダーの記述 を参照してください。
このページとリンク先ページでは、ネストされた数種のかっこを使った “ShaderLab” 構文を説明しています。CGPROGRAM
スニペットは、標準の HLSL/Cg で記述されています。詳しくは 頂点シェーダーとフラグメントシェーダーの記述 を参照してください。
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 から構成され、固定関数頂点ライティングを有効にして、自身の基本マテリアルを設定します。
さらに複雑なサンプルは サーフェイスシェーダーの例 や 頂点とフラグメントシェーダーの例 を参照してください。