Unity のシェーダーは、次の 3 つの方法のいずれかで記述できます。
シェーダーが照明や影の影響を受ける場合は、サーフェイスシェーダーが最適です。サーフェイスシェーダーを使うと簡潔な書き方で複雑なシェーダーが書けます。それを可能としているのは、Unity のライティングパイプラインで行われる相互作用のための高次元の抽象化です。ほとんどのサーフェイスシェーダーは自動でフォワードと deferred ライティングをサポートします。サーフェイスシェーダーは数行の Cg/HLSL によって書くことができ、さらに多くのコードがそれらによって自動生成されます。
ライトを使用しない場合は、サーフェスシェーダーを使用しないでください。ポストプロセスエフェクト や多くの特殊エフェクトシェーダーに関しては、サーフェスシェーダーは 2 次的な最適化オプションです。なぜなら、それらは正当な理由無しに多くのライティングの計算を行うからです。
シェーダーに照明効果との相互作用を必要とせず、サーフェイスシェーダーが扱えないようなエキゾチックなエフェクトが必要ならば、頂点シェーダーと Fragment シェーダーが適切です。この方法で書かれたシェーダープログラムは、必要なエフェクトを作成するためのもっとも柔軟なやり方です (サーフェイスシェーダーも自動で頂点やフラグメントシェーダーに変換されています)。しかし、相応の対価もあります。つまり、より多くのコードを書かなければならず、ライティングと相互作用させるのがより難しいのです。これらのコードも同様に Cg/HLSL で記述されます。
固定関数シェーダーは、とても簡易なエフェクトのための旧シェーダー構文です。より柔軟性が高いので、プログラムできるシェーダーを作成することが推奨されています。固定関数シェーダーはすべて Microsoft の .FX files や NVIDIA の CgFX に似た ShaderLab という言語で書かれています。内部では、すべての固定関数シェーダーは、シェーダーのインポート時に 頂点シェーダーと Fragment シェーダーに変換されます。
種類に関係無く、シェーダーのコードの中身は実際にはどれも ShaderLab にラップされています。ShaderLab はシェーダーの構造を整理するのに使われています。以下はその例です。
Shader "MyShader" {
Properties {
_MyTexture ("My Texture", 2D) = "white" { }
// colors や vectors などの他のプロパティーもここに置けます
}
SubShader {
// ここに
// - サーフェスシェーダー か
// - 頂点シェーダーとフラグメントシェーダー か
// - 固定関数シェーダー を置きます
}
SubShader {
// 古いグラフィックスカードでも実行できるように
// 簡単なバージョンの SubShader をここに置きます
}
}
ShaderLab シンタックス で ShaderLab 文法の基本的な概念について読んで入門してから、以下にリスト化しているチュートリアルに進んでいくことをお勧めします。
The tutorials include plenty of examples for the different types of Shaders. Unity’s post-processing effects allows you to create many interesting effects with shaders.
シェーダーの入門編や シェーダーリファレンス を参照してください。