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