All Shader files in Unity are written in a declarative language called ShaderLab. In the file, a nested-braces
syntax declares various things that describe the shader – for example, which shader properties to show in the Material Inspector, what kind of hardware fallbacks to perform, and what kind of blending modes to use. Actual shader code is written in
CGPROGRAM
snippets inside the same shader file. For more information, see Writing Surface Shaders and Writing vertex and fragment shaders.
このページとリンク先ページでは、ネストされた数種のかっこを使った “ShaderLab” 構文を説明しています。CGPROGRAM
スニペットは、標準の HLSL/Cg で記述されています。詳しくは 頂点シェーダーとフラグメントシェーダーの記述 を参照してください。
Shader はシェーダーファイルのルートコマンドです。すべてのファイルは必ずひとつのシェーダーのみを定義しないといけません。シェーダーは、それを使用するマテリアルをもつオブジェクトがどのようにレンダリングされるかを示します。
Shader "name" { [Properties] Subshaders [Fallback] [CustomEditor] }
シェーダーを定義します。このシェーダーは、name 以下に記述するマテリアルインスペクターに表示されます。 シェーダーでは、任意で、マテリアルインスペクターに表示する プロパティー の一覧を定義することもできます。その後に、サブシェーダーのリスト、任意でフォールバックとカスタムエディターの宣言を行います。
シェーダーに Properties (プロパティー) を記述できます。シェーダーで定義されたプロパティーは Unity の マテリアルインスペクター で表示されます。通常のプロパティーは、オブジェクトの色、テクスチャ、シェーダーにより使用される任意の値などです。
各シェーダーは SubShader (サブシェーダー) のリストから構成されます。少なくとも 1 つが必要です。シェーダーをロードすると、Unity はサブシェーダーのリストから、エンドユーザーのマシンでサポートされる最初のサブシェーダーを選択します。もしサポートされるサブシェーダーがない場合、Unity は Fallback (フォールバック) シェーダー の使用を試みます。
さまざまなグラフィックスカードは異なる性能を持ちます。このためゲーム開発者は、最新のハードウェアでゲームに最高のビジュアルを実現したいと望む一方、そのビジュアルを実際に楽しむのが人口の 3% でしかない、という状況は避けたい、という永遠の課題に悩まされます。サブシェーダーはこのような場合に活躍します。夢に描いたグラフィックス効果を、思いつく限りすべて盛り込んだサブシェーダーを 1 つ作り、古いグラフィックスカード向けには、別のサブシェーダーを追加します。それらのサブシェーダーでは、少しスローダウンした効果や、詳細を省いた効果を実装できます。
シェーダーの “level of detail” (LOD) と、“シェーダーの置き換え” もまた、サブシェーダーに使用できるテクニックです。詳細は シェーダー 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) に定義します。次に 1 つのサブシェーダーを定義します。サブシェーダーはひとつの Pass で構成され、固定関数頂点ライティングを有効にして、その基本マテリアルを設定します。
さらに複雑なサンプルは サーフェイスシェーダーの例 や 頂点とフラグメントシェーダーの例 を参照してください。