コンピュータグラフィックスパイプライン、または単にグラフィックスパイプライン、レンダリングパイプラインとも呼ばれるこのプロセスは、3次元(3D)シーンを画面上の2次元(2D)表現に変換する一連の手順です。 [ 1 ] 3Dモデルが生成されると、 3Dコンピュータグラフィックスパイプラインは、そのモデルをコンピュータディスプレイ上で視覚的に認識できる形式に変換します。[ 2 ]
特定のソフトウェアおよびハードウェア構成、そして望ましい表示属性に依存するため、普遍的に適用可能なグラフィックスパイプラインは存在しません。しかしながら、 Direct3D、OpenGL、Vulkanなどのグラフィックスアプリケーションプログラミングインターフェース(API)は、共通の手順を標準化し、特定のハードウェアアクセラレータのグラフィックスパイプラインを管理するために開発されました。これらのAPIは、基盤となるハードウェアの上に抽象化レイヤーを提供することで、プログラマがAMD、Intel、Nvidiaなどの様々なグラフィックスハードウェアアクセラレータを明示的にターゲットとするコードを記述する必要性をなくします。
グラフィックスパイプラインのモデルは、通常、リアルタイムレンダリングで使用されます。多くの場合、パイプラインのステップの大部分はハードウェアで実装されており、これにより特別な最適化が可能になります。「パイプライン」という用語は、プロセッサ内のパイプラインに対しても同様の意味で使用されます。つまり、特定のステージに十分なデータがある場合、パイプラインの個々のステップは並列に実行されることがよくあります。
3D パイプラインは通常、レイ トレーシングやレイ キャスティングとは異なり、最も一般的なコンピュータ 3 次元レンダリングの形式である3D ポリゴンレンダリングを指します。レイ キャスティングでは、カメラの位置から光線が発射され、その光線が表面に当たると、光線が当たった表面上の点の色と照明が計算されます。3D ポリゴン レンダリングでは、その逆が行われます。カメラに与えられた領域が計算され、カメラに与えられたすべての表面のすべての部分から光線が作成され、カメラまでトレースされます。[ 3 ]
グラフィックスパイプラインは、アプリケーション、ジオメトリ、ラスタライズの3つの主要な部分に分けられます。[ 4 ]
![]()
アプリケーション処理は、メインプロセッサ( CPU、GPU )上のソフトウェアまたはハードウェアによって実行されます。アプリケーション処理中は、入力デバイスを使用したユーザー操作やアニメーションの実行など、必要に応じてシーンに変更が加えられます。変更されたプリミティブ(点、線、三角形など)を含む新しいシーンは、パイプラインの次のステップに渡されます。
応用ステップの例としては、衝突検出、アニメーション、モーフィング、クワッドツリーやオクツリーなどの空間分割方式を用いた高速化技術などが挙げられます。これらは、特定の時点で必要なメインメモリの量を削減するためにも使用されます。現代のコンピュータゲームの「世界」は、通常、利用可能なオンボードメモリよりも大きくなります。
ジオメトリパイプラインと頂点パイプラインは、ポリゴンに関するほとんどの操作を担当します。これらはさらに5つのタスクに分けられます。これらのタスクが実際の並列パイプラインステップとしてどのように構成されるかは、実装によって異なります。
![]()
ワールド座標系は、仮想世界が作成される座標系です。シーンに含まれるオブジェクト(家、木、車など)は、モデリングを簡素化するために、多くの場合、オブジェクト座標系(モデル座標系またはローカル座標系とも呼ばれます)で設計されます。これらのオブジェクトをシーン全体のワールド座標系またはグローバル座標系の座標に割り当てるには、オブジェクト座標を平行移動、回転、または拡大縮小によって変換します。これは、対応する変換行列を乗算することによって行われます。さらに、1つのオブジェクトから、たとえば木から森を作成するなど、異なる変換を施した複数のコピーを作成することもできます。これはインスタンス化と呼ばれます。

シーンにはオブジェクトに加えて、シーンがレンダリングされる際の視点の位置と方向を示す仮想カメラまたはビューアも定義されます。シーンは、カメラが原点にあり、Z軸に沿って視線を向けるように変換されます。結果として得られる座標系はカメラ座標系と呼ばれ、この変換はカメラ変換またはビュー変換と呼ばれます。
3D投影ステップでは、ビューボリュームを、角点の座標が(−1, −1, 0)と(1, 1, 1)の立方体に変換します。場合によっては、他のターゲットボリュームも使用されます。このステップは、ボリュームを別のボリュームに変換するにもかかわらず、結果として得られるZ座標は画像には保存されず、後のラスタリングステップでのZバッファリングでのみ使用されるため、投影と呼ばれます。透視図では、中心投影が使用されます。
表示されるオブジェクトの数を制限するために、2つの追加のクリッピング平面が使用されます。そのため、視覚ボリュームは切頭ピラミッド(円錐台)になります。平行投影または直交投影は、例えば技術的な表現に使用されます。これは、オブジェクト空間のすべての平行線が画像空間でも平行であり、ビューアからの距離に関係なく表面とボリュームのサイズが同じであるという利点があるためです。地図では、例えば直交投影(いわゆるオルソフォト)が使用されますが、風景の斜め画像はこの方法では使用できません。技術的にはレンダリングできますが、歪みがひどく、実用的ではありません。
効率性の観点から、カメラ座標系を省略するために、カメラと投影行列は通常、変換行列に統合されます。結果として得られる行列は通常、単一の画像に対して同じですが、ワールド行列はオブジェクトごとに異なります。そのため、実際には、表示時にワールド行列のみを調整すれば済むように、ビューと投影は事前に計算されます。ただし、頂点ブレンドなどのより複雑な変換も可能です。ジオメトリを変更する自由にプログラム可能なジオメトリシェーダーも実行できます。
実際のレンダリングステップでは、ワールド行列 * カメラ行列 * 投影行列が計算され、最終的にすべての点に適用されます。これにより、すべてのオブジェクトの点が直接スクリーン座標系に転送されます(少なくともほぼ、軸の値の範囲は可視範囲では依然として -1 ~ 1 です。「ウィンドウ - ビューポート - 変換」のセクションを参照してください)。
多くの場合、シーンには、オブジェクトの照明をよりリアルに見せるために、異なる位置に光源が配置されています。この場合、各頂点に対して、光源と対応する三角形に関連付けられたマテリアル特性に基づいて、テクスチャのゲイン係数が計算されます。後のラスタライズ手順では、三角形の頂点の値がサーフェス上に補間されます。一般的な照明(環境光)は、すべてのサーフェスに適用されます。これは、シーンの拡散光であり、方向に依存しない明るさです。太陽は指向性のある光源であり、無限に遠くにあると想定できます。太陽がサーフェスに及ぼす照明は、太陽からの方向ベクトルとサーフェスの法線ベクトルのスカラー積によって決定されます。値が負の場合、サーフェスは太陽に面しています。


視覚ボリューム内にあるプリミティブのみをラスタライズ(描画)する必要があります。この視覚ボリュームは、頂点が切り取られたピラミッドの形状であるフラスタムの内部として定義されます。視覚ボリュームの外側にあるプリミティブは破棄されます。これはフラスタムカリングと呼ばれます。考慮すべきプリミティブの数を減らす背面カリングなどのさらなるカリング方法は、理論的にはグラフィックスパイプラインのどのステップでも実行できます。キューブの内部に部分的にしか入っていないプリミティブは、キューブに対してクリッピングする必要があります。前の投影ステップの利点は、クリッピングが常に同じキューブに対して行われることです。視覚ボリューム内にある(場合によってはクリッピングされた)プリミティブのみが最終ステップに転送されます。

画像を画面上の任意のターゲット領域(ビューポート)に出力するには、ウィンドウ-ビューポート変換という別の変換を適用する必要があります。結果として得られる座標は、出力デバイスのデバイス座標です。
最新のハードウェアでは、ジオメトリ計算の大部分は頂点シェーダーで行われます。これは原則として自由にプログラム可能ですが、一般的には少なくとも点の変換と照明計算を実行します。DirectXプログラミングインターフェースでは、バージョン10以降はカスタム頂点シェーダーの使用が必要ですが、それ以前のバージョンでは標準シェーダーが引き続き使用できます。
ラスタライズ処理は、フラグメントシェーダーパイプラインの直前に行われる最終ステップであり、すべてのプリミティブがラスタライズされます。ラスタライズ処理では、連続したプリミティブから離散的なフラグメントが作成されます。
グラフィックスパイプラインのこの段階では、グリッドポイントは、より明確に区別するためにフラグメントとも呼ばれます。各フラグメントはフレームバッファの 1 つのピクセルに対応し、これは画面の 1 つのピクセルに対応します。これらは色付け(および場合によっては照明)できます。さらに、ポリゴンが重なっている場合は、観察者により近い可視フラグメントを決定する必要があります。このいわゆる隠面判定には、通常 Z バッファが使用されます。フラグメントの色は、可視プリミティブの照明、テクスチャ、およびその他のマテリアル特性に依存し、多くの場合、三角形の頂点プロパティを使用して補間されます。利用可能な場合は、オブジェクトの各フラグメントに対して、ラスタリングステップでフラグメントシェーダー(ピクセルシェーダーとも呼ばれます)が実行されます。フラグメントが可視である場合、透明度またはマルチサンプリングが使用されている場合は、画像内の既存の色値と混合できます。このステップでは、1 つ以上のフラグメントがピクセルになります。
ユーザーがプリミティブの段階的なラスタライズを目にしないようにするため、ダブルバッファリングが行われます。ラスタライズは専用のメモリ領域で行われ、画像が完全にラスタライズされると、画像メモリの表示領域にコピーされます。
使用される行列はすべて正則行列であり、したがって可逆行列です。2つの正則行列の乗算によって別の正則行列が生成されるため、変換行列全体も可逆行列となります。スクリーン座標からワールド座標を再計算するには、逆行列が必要です。たとえば、マウスカーソルの位置からクリックされたオブジェクトを特定するために使用します。ただし、スクリーンとマウスは2次元しかないため、3次元目は不明です。そのため、カーソル位置からワールドに光線を投影し、この光線とワールド内のポリゴンとの交点を求めます。