Unity のシェーダーは、次の 3 つの方法のいずれかで記述できます。
シェーダーが照明や影の影響を受ける場合は、サーフェイスシェーダーが最適です。サーフェイスシェーダーを使うと簡潔な書き方で複雑なシェーダーが書けます。それを可能としているのは、Unity のライティングパイプラインで行われる相互作用のための高次元の抽象化です。ほとんどのサーフェイスシェーダーは自動でフォワードと deferred ライティングをサポートします。サーフェイスシェーダーは数行の Cg/HLSL によって書くことができ、さらに多くのコードがそれらによって自動生成されます。
照明に関係ないシェーダーが必要ならば、サーフェスシェーダーを使用しないでください。サーフェスシェーダーはこれといった理由もなくたいへん多くのライティングの計算を行うため、イメージエフェクト や特別エフェクトにとっては最適ではありません。
シェーダーに照明効果との相互作用を必要とせず、サーフェイスシェーダーが扱えないようなエキゾチックなエフェクトが必要ならば、頂点シェーダーと 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 文法の基本的な概念について読んで入門してから、以下にリスト化しているチュートリアルに進んでいくことをお勧めします。
チュートリアルにはさまざまな種類のシェーダーの例が掲載されています。Unity の イメージエフェクト パッケージには多くの興味深い頂点シェーダー、フラグメントシェーダーが含まれています。
シェーダーの入門編や シェーダーリファレンス を参照してください。