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” の二つもまた、サブシェーダーの作成に使用できるテクニックです。詳細は シェーダー LOD と Shader Replacemementを参照してください。
考えられるもっともシンプルなシェーダーの例:
// colored vertex lighting
Shader "Simple colored lighting"
{
// a single color property
Properties {
_Color ("Main Color", Color) = (1,.5,.5,1)
}
// define one subshader
SubShader
{
// a single pass in our subshader
Pass
{
// use fixed function per-vertex lighting
Material
{
Diffuse [_Color]
}
Lighting On
}
}
}
このシェーダーでは color プロパティーとして _Color (マテリアルインスペクトで Main Color として表示)を、デフォルト値 (1, 0.5, 0.5, 1) として、定義します。次にひとつのサブシェーダーを定義します。サブシェーダーはひとつの Pass から構成され、固定関数頂点ライティングを有効にして、自身の基本マテリアルを設定します。
さらに複雑なサンプルは サーフェイスシェーダーの例 や 頂点とフラグメントシェーダーの例を参照してください。