ここ最近までの3Dグラフィックスの歴史を大ざっぱに理解したところで、今度は3Dグラフィックスの処理の流れを解説したい。

3Dグラフィックスのパイプラインの模式図

3Dグラフィックスの流れを模式化したのが図1だ。これは、DirectX 10世代/SM4対応GPUまでの流れを模式化しているが、一部の流れの順番はGPUによって異なる場合や、あるいは細かい処理フェーズについては一部、簡略化している部分もある。この点はご了承頂きたい。

まず、どうして3Dグラフィックス処理がこうなっているのかという根本的な話について触れておこう。こうなっているのは、長くも短いリアルタイム3Dグラフィックスの歴史の中で、これが最も処理がスムーズに行きそうで、なおかつGPU(ハードウェア)設計としてインプリメントがやりやすいという理由からだ。この流れはDirect3Dでも、OpenGLでも大きな違いはない。

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

CPUが担当する3Dグラフィックス処理部分=ゲームエンジン!?

図1にある[1]と[2]の項目は、これは主にCPUによって行われる処理系だ。

3Dオブジェクトを配置したり、移動して再配置したり……といった部分に相当するところで、これをシステマティックに処理するのがいわゆる「ゲームエンジン」と呼ばれる部分になる。

ゲームエンジンでは、キー入力、マウス入力、ゲームコントローラ入力に従って3Dキャラクタを移動させたり、銃撃が敵に命中したかどうかの衝突判定を行ったり、衝突の結果、3Dキャラクタ同士を吹っ飛ばすための物理シミュレーションを行うが、そうしたゲームロジックの部分は、ある意味、[1][2]に相当する部分だ。

なお、[2]はDirectX 10/SM4.0対応GPUであればジオメトリシェーダを活用すれば、GPUで行うことも出来るようになっている。例えばパーティクルやビルボードのようなポイントスプライトについては生成や消滅をジオメトリシェーダで司らせ、CPUを介在させないで処理することができる。とはいえ一般的な3Dゲーム処理などでは、まだまだこの部分はCPUが担当する部分だといえる。

頂点パイプラインと頂点シェーダ~座標系ってなに?

図中で赤ラインにかかっている[3][4][5][6]の部分が、頂点次元の処理を行う頂点パイプラインだ。

通常はここからがGPU内部で処理が行われる部分になる。ただし、内部ロジックを簡略化して低コストでグラフィックス機能を統合させた、いわゆる「統合チップセット」などでは、この頂点パイプラインをCPUで肩代わりする(エミュレーションする)システムも存在する。

さて、ちょっと前までは、この頂点パイプラインのことを「ジオメトリ処理」などと呼ぶことも多かった。ジオメトリ(Geometry)とは「幾何学」のことで、高校生以上ならば数学で「代数・幾何」などの授業で「ベクトルの演算」や「写像や一次変換」などを習ったことがあるかもしれないが、あの世界のことだ。余談だが、NVIDIAのGPU、GeForceシリーズの名前の由来は「Gemoteric Force(幾何学的な力)」を縮めた造語で、「G-Force(重力)」に引っかけたダジャレになっているといわれている。

話を戻すと、3Dグラフィックスを語る上で必ず登場する「三次元ベクトル」という概念は、簡単に言えば「三次元空間上の"向き"」だと思えばよい。そうした"向き"はx,y,zの3軸の3つの座標値に表され、その"向き"の基準を「座標系」という。

この座標系にはローカル座標系とワールド座標系(グローバル座標系)というものがある。

「ローカル座標系」は、具体的にいえばある3Dキャラクタにとって適当に決めた基準となる座標系のこと。3Dキャラクタの向きはその3Dキャラクタ基準の座標系で「どっちに向いている」と管理して制御した方が楽だ。だからローカル座標系という概念を利用するのだ。

ところで、一般的な3Dキャラクタには腕や足が付いていることが多いが、これをその関節から曲げたりすることを考えた場合は、関節を基準としたローカル座標系で制御した方が分かりやすい。しかし、こうして考えていくと、ローカル座標系は階層構造になってしまっていて、最終的に処理を取りまとめる際に訳が分からなくなる。

そこで、その3D空間全体を支配する座標系が必要になる。それが「ワールド座標系」だ。3Dグラフィックスの頂点パイプラインおける頂点単位の処理では、このローカル座標系からワールド座標系への変換が頻発する。

こうした頂点単位の座標系変換処理を、シェーダプログラムに従って行うのが[3]の「頂点シェーダ」(Vertex Shader)なのだ。シェーダプログラムを組み替えれば、ユニークかつ特殊な座標変換が行えるというわけだ。(続く)

図2: 座標系の概念図

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