図1: GPU内部におけるレンダリングの流れ

頂点パイプラインの最終処理

[5][6]はいよいよ実際の描画に向けての最終準備段階的な処理に相当する。

ワールド座標系に整理された座標系をさらに、[5]でカメラ(視点)から捉えた座標系に変換する処理をおこなう。そして画面に表示する際にどう見えるか……具体的にはどういう視界にするかといった変換も行う。これは写真撮影におけるカメラのフレーミングやレンズの選択に相当する部分だといえる。こうした一連の処理をひっくるめて「透視変換処理」といったりする。

さて、3Dグラフィックスは視界で捉えた映像を描画すればいいので、[5]の処理が終わると、視界主体の考え方に移行してくる。

[6]は描画しなくてもよいと判断されるポリゴンを、実際の描画処理を行うピクセルパイプラインに突入する前段階で破棄していくプロセスだ(カリング処理といったりもする)。

「クリッピング処理」は、視界から完全に外にいる3Dモデルのポリゴンを破棄し、3Dモデルのポリゴンのうち視界から掠め取られるようなポリゴンについては、視界の範囲内のポリゴンに切り取る処理も行う。

「隠面処理」は視点方向に向いていない、理論上は、視点からは見えていないはずのポリゴンを破棄する処理のこと。透明オブジェクトが絡んで来た場合には、この処理を行うと不具合が出てくる場合もある。

ピクセル単位の仕事へ分解発注するラスタライザ

視界本位に変換も終え、不要なポリゴンも破棄した後、[7]で行うのは、ここまで実態のなかったポリゴンを、これから描画する画面上の画素(ピクセル)へ対応付ける処理だ。なお、最新の3Dグラフィックスでは表示フレームの描画でだけでなく、シーンをテクスチャへレンダリングする場合もあり、その際には[7]ではポリゴンとテクスチャ画素(テクセル)への対応付けを行うことになる。

この[7]での処理は、実質的には、頂点パイプラインにて頂点単位(ポリゴン単位)の出力となっている計算結果を、ピクセル単位の仕事に分解して、続くピクセルパイプラインに向けて発注する、いわば仲介業的な役割になっている。

この[7]の処理は「トライアングルセットアップ」、または「ラスタライズ処理」と呼ばれ、決まり切った処理系であることから、1990年代の初期のGPUからずっと固定機能としてGPUに実装されていて、今でも大きな進化はない。

通常、1つのポリゴンは複数のピクセルで描かれるので、ポリゴンはラスタライザによって大量のピクセルタスクに分解される。GPUにおいてピクセルシェーダの個数が圧倒的に多いのはどうしてもピクセルシェーダの仕事の方が増えてしまうからなのだ(続く)。

図5: ラスタライザはピクセルシェーダへの発注書を作成するところ……ともいえる。なお、1つのポリゴンから複数のピクセルタスクが生まれる

(トライゼット西川善司)