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

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

グラフィックス・パイプライン(Graphics pipeline)またはレンダリング・パイプライン(Rendering pipeline)とは、3次元コンピュータグラフィックスの計算処理方法の1つであり、3次元モデルのデータから2次元画像のイメージを作り出す多段階の過程全体を指し、それらの計算をパイプライン処理によって高速化する手法を示す。グラフィックス・パイプラインは、時間のかかるレンダリング処理の高速化に注力している。この用語は、専用ハードウェアまたは汎用機のソフトウェアを使用した、3D-2D変換の内部処理の各過程の総体を示し、処理途中に人の関与が無いブラックボックスであることを暗に示す。

以下にグラフィックス・パイプライン処理の各段階を示すが、3DCG処理の全体像については3次元コンピュータグラフィックスを参照のこと。

基本的な処理[編集]

グラフィックス・パイプラインの基本的な処理段階の各々は、一般に「ステージ」と表現される。(カッコつきのステージはパイプラインの前後段階である。)

(モデリング)[編集]

3次元座標を入力して3次元ワールド空間として知られている座標のデータを得る。これには拡大縮小と回転のようなローカルなオブジェクト空間上での基本的な座標変換も含む。

視点変換[編集]

物体は3次元のワールド空間座標から3次元の仮想カメラの位置と方向を元にした3次元座標系に変換される。この結果、元の3次元シーンはカメラの視点から見たものになる。この座標系は視空間ないしカメラ空間と定義される。

クリッピング[編集]

カメラの視界である視錐体の外にはみ出した座標は、この段階で不可視にされ捨てられる。クリッピングは正しい画像イメージを出力するのには必要なものではないが、見えない物体のデータを削れば、この後に続くレンダリング処理が高速化できる。視錐体を横切る「見切れ」状態の座標データは断端となる交点が求められ、両端が視錐体外でも一部が視錐体内を横切る線分にも注意が払われる。

ラスタライゼーション[編集]

ラスタライゼーションは描画シーンをラスターフォーマットに変換して、2次元画像空間に表現する処理である。これによりピクセル値が決定される。

通常、ラスタライズの処理には以下の効果のための処理が含まれる。特に三角形内のピクセルごとの色を決めるピクセル・シェーディング処理がパイプラインの主要な処理を占めるため、処理速度の向上のためには可能な範囲での並列・順次処理が計られる。 2000年代初めまではバーテックス・シェーダ、ジオメトリシェーダ、ピクセル・シェーダが順番に処理を行なうことが高速化の主流であったが、よりリアル感を求める高度処理の必要性の高まりや高解像化に対応して2000年代後半(2006年-2007年頃)にはこれらを統合した統合シェーダによってさらに高速化がはかられている。

ライティング処理
完全な3次元シーンでの座標は光源の場所と反射率、表面の特性によって定義されるものによって照らされる。現在のグラフィックス・パイプラインを実装したハードウェアでは、レンダリングされたポリゴンの垂直方向にのみ照明を計算している。頂点間の照明の値はラスタライズの間に補間される。Per-fragment(いわゆるPer-pixel)ライティングは現在のグラフィックス・ハードウェアでは、シェーダプログラムと呼ばれるものにより、ラスタライズ後に処理される。
テクスチャとフラグメント・シェーディング
独立したフラグメント、またはピクセルごとに頂点からやメモリ上のテクスチャから補間した値を基にして色を割り当て、よりリアルな陰影や表面の質感を与える。

(出力)[編集]

完成した動画像データが出力として得られる。

実時間処理[編集]

グラフィックス・パイプラインの処理例
1.3Dモデルの構築と取得 2.モデルの配置 3.陰影付加 4.頂点追加 5.画角とクリッピング、陰面処理など 6.ピクセル割り当て 7.テクスチャー貼り付け 8.特殊効果の追加 9.ビデオ映像の読み出し

PCのグラフィクス・カードなどに用いられているものや、自動車産業等でのCAD用画像でのグラフィックス・パイプラインの技術は、動画像を実時間で生成する処理を行っており、映画産業のように必ずしも実時間で処理する必要がないCG動画とは求められる精度や方向性が異なっている[1]。以下に実時間処理での各段階を示すが、こういった用途での専用ハードウェアについてはGPUを参照のこと。

コンピュータ・グラフィックスの専用ハードウェアにグラフィックス・パイプラインの処理を指示するための標準的な3DCG用APIには、OpenGLDirect3Dがある。

2010年現在のCG動画像生成を行う実時間処理の専用ハードウェアは、多くの場合、グラフィックスカード上のGPUを指す。GPUでも上記で示した基本的な処理の流れに沿って処理されているが、単にパイプライン処理するだけでなく、画像の処理単位を幾つも分解して、半ばハードワイヤード化された専用回路や、プログラム処理が可能な汎用的な回路といった多くの同一の演算回路を同時並列的に用いることで、必要な演算性能を得ている。演算回路の並列度の増加がそのまま処理性能の向上に比例する傾向が強いため、半導体の集積度向上に応じて年ごとに演算回路の数が増加している。2010年現在では、プログラム処理が可能な汎用回路の数が最大では1000基を越える規模になっている[2]

従来の古典的なGPUでは固定機能ハードウェアで実装されていた3D-2D変換機能が、新たに登場している高性能GPUでは固定でなくなったために、基本的な変換機能から高度なエフェクトまですべての動作指示を統合シェーダ用のプログラムで記述しなければ図形を描くことが出来なくなった。

入力[編集]

ホストプロセッサからGPUローカルメモリへの書き込みの形をとって、ポリゴンの頂点形式の3Dモデル基本データや、付随するテクスチャ・データ、背景画像、ライティングとモデル位置、処理プログラムなどの情報を得る。

多様な変換処理[編集]

モデルの頂点座標データなどはシェーダ・ユニットなどによって幾度も多様な変換処理を受けて最終的にフレームバッファに結果が格納される。以下に主な2種の3D用プログラミング・モデルでの処理の流れを示す。不要な処理ステージはスキップされる。「ラスタライザ」を挟んで前半が頂点データを扱う「頂点パイプライン」であり、ジオメトリ・シェーダから始まる後半がピクセル・データを扱う「ピクセル・パイプライン」である。これらはプログラム上の仮想的な処理順であって、実際の回路構成とは異なっている。カッコ内は演算フローの外部に位置する演算ユニットである。

"MS DirectX 11"でのステージ

  • インプット・アッセンブラ
  • バーテックス・シェーダ*
  • 3種のテッセレーション・ユニット
    • ハル・シェーダ*
    • テッセレータ
    • ドメイン・シェーダ*
  • ジオメトリ・シェーダ*
  • ラスタライザ
  • ピクセル・シェーダ*
  • (テクスチャ・フィルタリング)
  • (コンピュート・シェーダ*)
  • アウトプットマージャ

"OpenGL 4.0"でのステージ

  • バーテックス・プラー
  • バーテックス・シェーダ
  • テッセレーション
  • ジオメトリ・シェーダ
  • トランスフォーム・フィードバック
  • フラグメント・シェーダ
  • (テクスチャリング)
  • (ピクセルパイプライン)


MS DirectX 10からは「汎用シェーダ」などと呼ばれるプログラム可能なシェーダ・ユニットが「バーテックス・シェーダ」「ジオメトリシェーダ」「ピクセルシェーダ」などを兼ねて演算を行うようになっており、MS DirectX 11では上図で"*"印を付けて示したように、バーテックス・シェーダ、ハル・シェーダ、ドメイン・シェーダ、ジオメトリ・シェーダ、ピクセル・シェーダ、コンピュート・シェーダが、実際のGPM内では汎用シェーダで実行されていると想定されている。[3][4][5][6]

バーテックス・シェーダは、モデルのポリゴンを頂点単位で陰影処理を行う。また、テッセレーションの前、または後で視点変換しクリッピング処理を行い、深度情報によって視点から完全に見えなくなるポリゴンはカリング (Culling) 処理によって除去される。この過程でモデルの座標情報は視点から見える3次元空間内でのワールド座標系へと変換される。

テッセレーションを実行するユニットは頂点を新たに付加することができる[7]。これらによって、距離適応型テッセレーションやディスプレイスメントマップのような効果が付けられる。

ジオメトリ・シェーダは頂点を新たに加えることが可能であり、物理シミュレーションのような動きに対応した頂点座標の変換を加える。プリミティブシェーダとも呼ばれる。

ラスタライザによってポリゴンが2次元配列のピクセルに対応付けされる。一般にテクスチャ・データを用いることも可能である[8][9]

ピクセル・シェーダやフラグメント・シェーダはピクセル単位の陰影処理を行う(狭義のレンダリング処理)。また、テクスチャをポリゴン表面のピクセルごとに貼り付けるテクスチャ・マッピング処理やテクスチャ・フィルタリング処理を行う。これらには、テクスチャ・データに応じてバンプ・マッピングのような多種類の修飾が含まれる。

上記で「○○シェーダ」と示されているステージは必ずしも対応する専用の演算回路がGPU内に存在する訳ではなく論理的なものであり、専用ハードウェアで実行されるか汎用の統合シェーダで実行されるかはGPUチップと制御プログラムによって決まり、たとえ専用ハードウェアが存在していてもこれらすべてのステージを実行する必要もない。また、ピクセル・シェーダやジオメトリ・シェーダ、テッセレーションを行うユニット群などはバーテックス・シェーダの後から加わったステージであるため、こういった新ステージが存在しなかった前世代のGPUチップでは同様の機能をバーテックス・シェーダで実行するか、全く対応できない。逆に、例えばピクセル・シェーダはラスタライザの後に登場したが、最終工程で高度な演算によって2次元画像を描き出してゆくピクセル・シェーダだけで用が足りれば、比較的単純なしくみで頂点データから2次元画像を描き出してゆくラスタライザは用いられないこともある。

すべての頂点とフラグメントは独立したものと扱われ、並列に配置された多数のシェーダ・ユニットが同時平行的に処理を行なう。これらの点で現在のGPUはストリーム・プロセッサであると同時にアレイ・プロセッサといえる。

送出[編集]

表示装置の画素に対応した「フレームバッファ」と呼ばれる表示用のバッファメモリから、規定のタイミングで表示用データが読み出されて表示装置へ信号が送られ、最終的に色がついたピクセルがコンピュータ・モニタやその他の表示装置上に表示される。

脚注[編集]

  1. ^ 例えば、よりリアルな画像が得られる大域照明 (global illumination) モデルを実現するにはラジオシティ法のような手法が適するが、これは大きな演算量を必要とするために実時間処理は現実的ではない。一般的には、実時間処理を必要としないCG動画像の生成では、現実に起きているのと同じように自然な光源からの光線による物理シミュレーションをほとんど忠実に行うことでリアル感を得ることが可能なのに対して、実時間処理を必要とするCG動画像の生成では、演算量を省くための多様な工夫を凝らして物体表面の質感などを擬似的に作り出すことが多い。
  2. ^ GPUによるグラフィックス・パイプラインでのステージは、CPUによる命令パイプラインのステージとは論理的/物理的という違いに加えて、グラフィックス・パイプラインの方が処理の粒度がより大きく、基本的には演算結果は逐次、ローカルメモリーに書き出される。CPUの命令パイプラインでは基本的にステージ間は高速のラッチ回路で結ばれている。
  3. ^ 元々"Shading"(シェーディング)は元画像に対しての光源からの光による陰影効果であり"Shader"(シェーダ)はその陰影処理を行う演算プログラムを意味していたが、単純な陰影だけでなくリアルなCG画像を生み出すために多様な修飾(=画面効果、エフェクト)を施す工夫が考案され、それ対応して専用の演算を行う数種類のシェーダ・ユニットが生み出された。やがて、必要な演算の種類は異なるが、それぞれに専用の回路を設けるよりも単一の汎用処理回路上でプログラムによって多様な演算をこなす方が得策だとして、「統合シェーダ」が採用されるようになっている。
  4. ^ DirectX 8からは、シェーダ・ユニットをプログラムによって可変演算が行える「プログラマブル・シェーダ」が導入された。
  5. ^ DirectX 10からは「バーテックス・シェーダ」と「ピクセル・シェーダ」に「ジオメトリ・シェーダ」が加わった。
  6. ^ "OpenGL 4.0"のバーテックス・シェーダはラスタライジングまで機能に含まれている。
  7. ^ 新たに頂点を生成する機能は、バーテックス・シェーダでも備えている。
  8. ^ テクスチャ・データは、使用される前までは DXTC(DirectX Texture Compression) という圧縮技術によってDXT1からDXT5までのファイル形式で保持されている。テクスチャ・データは一般的に2次元画素であり、テクスチャを構成する画素は「テクセル」(texcel)と呼ばれる。
  9. ^ 半透明な物体を表現するには反射光や屈折光の他にも前後関係を維持するZバッファ(深度バッファ)が最後まで欠かせない。

関連項目[編集]