Unity のシェーダは,次の 3 つの方法のいずれかで記述できます。
シェーダーが照明や影に影響される必要がある なら, Surface Shaders (サーフェイスシェーダー)が一番良い選択肢です。サーフェイスシェーダーは簡潔な書き方で複雑なシェーダーを簡単に書けるようにします。それを可能としているのは, Unity のライティングパイプラインで行われる相互作用のための高次元の抽象化です。ほとんどのサーフェイスシェーダーは自動で前後からのライティングをサポートします。サーフェイスシェーダーは数行の Cg/HLSL によって書くことができ,より多くのコードはそれらによって自動生成されます。
もしシェーダーが照明に関係しないものならばサーフェイスシェーダーは 使わない様にして下さい。 Image Effects や,多くの特別なエフェクトを表現するシェーダーがあるため,照明に関係しない場合サーフェイスシェーダーは次善策です。特に照明などは無くとも,サーフェイスシェーダーは多量のライティング演算を行うからです。
あなたのシェーダーが照明効果との相互作用を必要とせず,サーフェイスシェーダーが扱えないような外国情緒溢れるエフェクトが必要ならば,頂点シェーダー,フラグメントシェーダーが適役でしょう。この方法で書かれたシェーダープログラムは,必要なエフェクトを作成するための最も柔軟なやり方です(サーフェイスシェーダーも自動で頂点やフラグメントシェーダーに変換されています)。しかし,相応の対価もあります。つまり,より多くのコードを書かなければならず,ライティングと相互作用させるのがより難しいのです。これらのコードも同様に Cg/HLSL で記述します。
固定関数シェーダーは,プログラミングできるシェーダーをサポートしていない古いハードウェア向けに書く必要があります。ゲームを古いハードウェアまたはシンプルな携帯プラットフォームで実行した時にも理にかなった表現を確実にしてくれる,空想のフラグメントシェーダーまたはサーフェイスシェーダーに対する予備の代替案として固定関数シェーダーを書きたいと思うかもしれません。Microsoft の .FX ファイルや NVIDIA の CgFx 同様,固定関数シェーダーは全て, ShaderLab という言語で記述します。
どの種類を選んだかは関係無く,シェーダーのコードの中身は実際にはどれも ShaderLab に覆われていて, ShaderLab はシェーダーの構造を整理するのに使われています。以下のように。
Shader "MyShader" {
Properties {
_MyTexture ("My Texture", 2D) = "white" { }
// other properties like colors or vectors go here as well
}
SubShader {
// here goes the 'meat' of your
// - surface shader or
// - vertex and fragment shader or
// - fixed function shader
}
SubShader {
// here goes a simpler version of the SubShader above that can run on older graphics cards
}
}
ShaderLab リファレンス でShaderLab 文法の基本的な概念について読んで入門してから,以下にリスト化しているチュートリアルに進んでいくことをオススメします。
チュートリアルには異なる種類のシェーダーに関して,たくさんの例が掲載してあります。特にサーフェイスシェーダーの例に関しては, Unity のビルトインのシェーダーの起源について Resource セクション から学べます。 Unity の イメージエフェクト パッケージには多くの興味深い 頂点シェーダー,フラグメントシェーダーが掲載されています。
シェーダーの導入のために読み,そしてシェーダーリファレンス をチェックしてください!