Unity の Shader の種類:超速Unityシェーダ入門(1)

Unityのロゴ。

シェーダ(Shader)を使うと、3D/2D 物体の色や外観を自由にコントロールしたり、様々な効果を付けたり、果ては高速に動かしたり大量に表示することができます。 このコンテンツでは基本的な Unity で使うことができるシェーダの基本的な内容だけをザックリ紹介していきます。ここでは特に Unity で使うことができるシェーダの種類について紹介します。

Unity のシェーダの種類

バージョンによって若干の違いはありますが、Unity には概ね次の種類のシェーダが用意されています。

  • Surface Shader
  • Vertex・Fragment / Unlit Shader
  • Image Effect Shader
  • Compute Shader

Surface Shader

Surface Shader は Unity 独自色の強いシェーダで、端的には簡単なシェーダです。 多少複雑で高度なシェーダを作りたいときは Vertex/Fragment(Unlit)シェーダを使います。

Surface Shader は、光源の影響や影の付き方、細かい色の付き方など、細かいことを考えなくても良い利点があります。 一方でそれらを細かく制御することは困難になります。

基本的な色を変化させたり、表面の質感を変更したり、テクスチャを変更したり、そういったことを手軽に素早く実現するために、 Surface Shader は有用です。

Vertex・Fragment Shader / Unlit Shader

Vertex・Fragment Shader は Unity 上では Unlit Shader などで表記されます。 UnlitUn LightedUn Illuminated の略称(のよう)で、基本的なライティング、光源からの影響などを無視したシェーダです。 このシェーダが適用された対象は、光源の影響を受けず、設定された色やテクスチャの色がそのまま出力されます。

Vertex・Fragment Shader と書いているのは、Unlit Shader の構造が、Vertex・Fragment Shader から構成されているためです。 本来、CG が描画(レンダリング)される過程を、レンダリングパイプラインと呼び、その過程にはいくつかの処理工程があります。 そのいくつかの処理工程に Vertex Shader と Frgment Shader が含まれます。

Vertex Shader は例えば 3DCG モデルの頂点の情報を読み取り、それを最終的に出力する位置などを決定するために使われます。 名前の通り、頂点を制御するシェーダです。

Fragment Shader は、Pixel Shader とも呼ばれることがあります。CG の最終的な出力は画像になるわけですが、 その画像の各画素を出力するときに、その画素をどのような色で出力するのかを制御するのが Fragment Shader です。

Vertex Shader では、例えば頂点を動かして形状を変化させたりアニメーションさせたりすることができます。 また頂点に色情報が設定されているモデルの場合には、その色を変更することなどができます。

Fragment Shader では、光源や影の影響を考慮したり、色を変更したり、もっと進めば輪郭線を描画したり、ボカシの効果を付け加えることなどが出来ます。 基本的には最終的な出力を決定するシェーダですから、このシェーダ一つで外観を大きく変化させることができます。

Surface Shader と比較して、光源や影の影響をすべて自分で考えて実装する必要があるので、比較的高度な知識が必要となります。

頂点シェーダーと Fragment シェーダーのプログラミング - Unity マニュアル

Image Effect Shader

Image Effect Shader は最終的に出力されるカメラやテクスチャ画像に適用するためのシェーダです。ポストエフェクトと呼ばれることもあります。 シェーダのソースコードの構造は Vertex Fragment Shader と同じで、多くの場合に Fragment Shader を編集し実装します。

例えば画面全体の色相(色調)を変更したり、画面全体を一律にぼかしたりすることができます。 それ以外にもシーン(画面)遷移するときの効果、フェードイン・アウト、モザイク、ディストーションなどが実現できます。

Compute Shader

最も高度で複雑なシェーダと言えると思います。特定のプラットフォームで GPU を使うために利用したり、 あるいはレンダリングパイプラインとは異なる目的と手段によって GPU を使った処理を実現するために使います。 ここでは詳細な説明を割愛します。

コンピュートシェーダー - Unity マニュアル