Graphic Processing Unit(GPU)

3Dグラフィックスを高速で処理するGPUは、実は、超マルチスレッドプロセサである。ということで、グラフィックス処理とGPUについてみて行こう。

3Dグラフィックスでは、実際には存在しないシーンを描く。しかし、アニメのように2次元の絵を描くのではなく、まず、ジオラマ(縮尺立体模型)のようなモデルを作る。モデルは、見かけが正しければよいので、張りぼてのようなモデルでよい。このように表面だけのモデルを「Surface Model」という。

色や反射率をもつ三角形のパネルで模型の表面を覆う。これは四角形でも、曲面でも良いが、GPUは、最終的には三角形に分解してしまうので、ここでは三角形のパネルだけを考える。そして、図2.1のように、かなめとなる頂点を共有するファンや、りんごの皮むきのように細い帯を作り、それを三角形に分解するトライアングルストリップを使えば、曲面を表現することができる。ただし、なめらかな表面にするためには、多数の三角パネルが必要になる。

図2.1 曲面はファンやトライアングルストリップで表現

ファンやトライアングルストリップは以前の三角形を定義する2点を使って、1点のデータを加えるだけで新たな三角形を作れるので、データ量という観点でも効率が良い。

モデルはビル、車、人物、怪物などのパーツごとにモデルを作って置き、それらを拡大、縮小してサイズを合わせる。そしてジオラマ全体の中での位置や向きを調整して配置する。

拡大、縮小は、モデルに含まれるすべての頂点の座標に、拡大、縮小率を掛ければよい。また、平行移動は各頂点のX、Y、Z座標にΔX、ΔY、ΔZを加えることで実現でき、モデルの向きは回転マトリクスを掛けることで実現できる。

図2.2 拡大,縮小、平行移動、回転のマトリクス

これらの操作は、パーツのモデルの全頂点の座標に図2.2に示す各種のマトリクスを掛けることで実現できる。この操作を拡大、縮小、平行移動、回転と順番にやらなくても、これらのマトリクスの積のマトリクスを計算しておき、それを頂点の座標に掛けてやればよい。このように全体をまとめて、それぞれのパーツを配置する操作を「モデルビュー変換」と呼ぶ。

モデルビュー変換は頂点の座標にモデルビュー変換マトリクスを掛けるという操作で、各頂点について16回の積和演算が必要になる。リアルな表現のモデルでは、数万~数10万頂点を必要とするので、50~500万回の積和演算が必要となる。これを毎秒60回計算しようとすると、30M~300M回の積和演算、つまり、60~600MFlop(浮動小数点演算)という膨大な演算が必要となる。

モデルビュー変換を行って、すべてのパーツをグローバル座標にまとめたデジタルジオラマに対して、どこにカメラを置いて撮影するかという視点変換を行う。視点変換では、遠近法に従って、近くのパネルは大きく、遠くのパネルは小さくなるマトリクスを掛け、画面の外に出るパネルを取り除く。完全に画面を外れるパネルは単純に削除すればよいが、画面の端に引っかかるパネルは、画面内の部分だけを取り出して、三角形に分割するという操作が必要になる。

画面内に入る三角パネル群ができると、各三角パネルをピクセルに分解するラスタライズを行う。この部分は専用ハードウェアで行うのが一般的である。

図2.3 三角形のパネルをピクセルで埋めるラスタライズ処理

そして、それぞれのピクセルの明るさや色を決めるピクセルシェーディングを行う。ピクセルシェーディングには色々なアルゴリズムがあるが、「Phongシェーディング」では、頂点を共有するすべての三角パネルの面の法線ベクトルの平均をとり、これを頂点の法線ベクトルとする。そして、三角パネル内の各ピクセルの法線ベクトルは3つの頂点の法線ベクトルからの補間で計算する。こうすれば、三角パネルは平面であるが、法線ベクトルが滑らかに変化するので、滑らかな曲面のように見える。

各ピクセルへの光源からの入射角と、視線への反射角を求め、その角度に従って、反射される光を計算する。一般に光源は複数あり、それぞれの光源について計算を行う必要があるので、数10~数100Mの膨大な計算量となり、毎秒60回の描画を行うためには、GFlopオーダの演算が必要となる。