Unity のすべての Shader ファイルは、ShaderLabと呼ばれる宣言型言語で記述されています。ファイルでは、ネストされた括弧構文は、シェーダーを説明するさまざまなことを宣言します。例えば、Material インスペクターに表示するシェーダーのプロパティ、実行するハードウェアフォールバックの種類、使用するブレンドモードの種類などです。実際のシェーダーコードは、同じシェーダーファイル内の CGPROGRAM
スニペットに書かれています。詳細については、サーフェスシェーダーの記述 および 頂点シェーダーとフラグメントシェーダーの記述 を参照してください。
このページとリンク先ページでは、ネストされた数種のかっこを使った “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 で構成され、固定関数頂点ライティングを有効にして、その基本マテリアルを設定します。
さらに複雑なサンプルは サーフェイスシェーダーの例 や 頂点とフラグメントシェーダーの例 を参照してください。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.