Unityシェーダ入門 #001 グラフィックスパイプライン

これからUnityのシェーダについて、1から学べるように書いていきたいと思います。

・グラフィックスパイプライン

 画面に3Dキャラクターなどのモデルを表示する際、最初の材料としてポリゴンを受け取り、いくつかの流れ作業を経た最終結果として、ディスプレイにピクセルが出力されます。この流れ作業全体のことをグラフィックスパイプラインと呼びます。DirectX(OpenGL)の世代により、ステージ(流れ作業の1工程のこと)の数や内容が異なりますが、ここではDirectX9のグラフィックスパイプライン(のごく一部)を例に挙げます。

1.頂点シェーダ(Vertex Shader)

 入力されたポリゴン(三角形)の各頂点を"座標変換"します。三次元の頂点を二次元に変換する、と考えてください。

2.ラスタライズ(Rasterize)

 さて、頂点は二次元になりましたが、これではただの点のままです。
(画面に点が三つだけちょこんと表示されるという寂しいことになります)
 入力したのは三角形ですので、三つの点の間をピクセルで埋める必要があります。ラスタライズの仕事は三つの頂点の間にピクセルを作成し、後のピクセルシェーダに引き渡すことです。
 ここでピクセルが生成される数は、ゲーム画面の解像度に比例します。たとえば解像度が1920x1080で、一つの三角形が画面全体を覆っているとすると、生成されるピクセルは1920x1080=207万3600ピクセルになります。また、解像度を1280x720に下げると92万1600ピクセルに減るため、後段の処理が軽くなります。(ゲームで解像度を下げると大幅に負荷が減るのはこのためです)

3.ピクセルシェーダ(Pixel Shader)

 ここではラスタライズから受け取ったピクセル一つ一つに、色を付けていきます。色の付け方は様々で、単色だったり、テクスチャの色を表示したり、ライティング計算を行ったりします。頂点数に比べてピクセルの数は多くなる(上の例では3頂点に対し約207万ピクセル)ため、ピクセルシェーダで重い計算を行うと、全体の負荷が高くなってしまいます。ここで色を付けたピクセルはディスプレイに出力され、最後にプレイヤーの目に届きます。

※お絵描きとグラフィックスパイプラインの比較
 頂点シェーダが線画、ラスタライズがべた塗り、ピクセルシェーダが陰影付け、に対応しています。