描画パイプラインの全体像(頂点→ラスタライズ→フラグメント)
3D モデルが画面のピクセルになるまでを、頂点処理からラスタライズ、フラグメント処理、出力結合まで順に追い、固定機能段とプログラマブル段の違いと GPU の並列実行まで一気につかめます。
- 1.描画パイプラインは頂点処理→プリミティブ組み立て→ラスタライズ→フラグメント処理→出力結合の一方向の流れで、各段の出力が次段の入力になる。
- 2.頂点シェーダとフラグメントシェーダはプログラマブル段、ラスタライズと深度・ブレンドの出力結合は固定機能段で、両者は役割が明確に分かれる。
- 3.GPU は頂点やフラグメントを大量に同時処理する SIMT 型の並列実行機で、パイプラインは段ごとに膨大なスレッドで埋めることを前提に設計されている。
描画パイプラインとは「座標をピクセルへ変換する組み立てライン」
3D グラフィックスの描画パイプライン(レンダリングパイプライン)は、頂点の集まりで表されたモデルを、最終的に画面上の色付きピクセルへ変換する一連の処理段です。OpenGL・Direct3D・Vulkan・Metal など主要な API はいずれもこのパイプラインを共有しており、名前や細部は違っても 段の並びとデータフローはほぼ同じ です。本記事が扱うのはラスタライズ方式のリアルタイムパイプラインで、レイトレーシングとは別系統です。
重要な性質は、これが基本的に 一方向(後戻りしない)の流れ だという点です。前段の出力がそのまま次段の入力になり、段どうしはパイプライン(流れ作業)として連なります。工場の組み立てラインと同じで、各段は自分の担当だけを行い、成果物を下流へ渡します。この構造が GPU(/hardware-components/ 参照)による大規模並列処理と相性がよく、リアルタイム描画を成立させています。
まず全体の並びを、入力・処理・出力の観点で押さえます。
描画パイプラインの主要段(データフロー):
頂点データ(頂点バッファ)
│ 頂点 = 位置+法線+UV+色 …
▼
① 頂点処理(Vertex Shading) … 頂点ごとに座標変換
│ 出力: クリップ空間の頂点
▼
② プリミティブ組み立て(Primitive Assembly) … 頂点を三角形へ束ねる
│ クリッピング・面のカリング・透視除算
▼
③ ラスタライズ(Rasterization) … 三角形を被覆ピクセルへ分解
│ 出力: フラグメント(ピクセル候補)+補間属性
▼
④ フラグメント処理(Fragment Shading) … フラグメントごとに色を決定
│ テクスチャ・ライティング
▼
⑤ 出力結合(Output Merger / ROP) … 深度・ステンシル・ブレンド
│
▼
フレームバッファ(画面 / レンダーターゲット)
各段の役割とデータの単位
パイプラインを理解する鍵は、段ごとに「処理の単位」が変わる ことです。頂点処理は頂点を、フラグメント処理はフラグメントを扱い、その間のラスタライズが単位を頂点からフラグメントへ変換する境界になります。
| 段 | 入力の単位 | 出力の単位 | 主な仕事 |
|---|---|---|---|
| ① 頂点処理 | 頂点 | 頂点 | モデル→クリップ空間への座標変換、頂点属性の準備 |
| ② プリミティブ組み立て | 頂点の並び | プリミティブ(三角形) | 頂点を三角形に束ね、クリップ・カリング・透視除算 |
| ③ ラスタライズ | 三角形 | フラグメント | 三角形が覆うピクセルを走査し、頂点属性を補間 |
| ④ フラグメント処理 | フラグメント | 着色済みフラグメント | テクスチャ参照・ライティングで最終色を計算 |
| ⑤ 出力結合 | フラグメント | ピクセル | 深度/ステンシル判定とブレンドでフレームバッファへ書き込み |
① 頂点処理 では、モデル空間で定義された各頂点を、モデル・ビュー・射影の各行列で順に変換し、最終的にクリップ空間(同次座標)へ移します。1 頂点ごとに独立して行う処理なので並列化しやすく、ここがプログラマブルな頂点シェーダの担当です。座標だけでなく、法線や UV 座標といった頂点属性もこの段で用意され、下流へ渡されます。
② プリミティブ組み立て は、頂点インデックスの並びに従って頂点を三角形(点・線の場合もある)へ束ねる段です。ここで クリッピング(視錐台の外へはみ出た部分を切り落とす)、面のカリング(裏を向いた三角形を捨てる背面カリング)、そして 透視除算(同次座標の w で割り、正規化デバイス座標へ落とす)が行われます。カリングやクリッピングは無駄なフラグメントの生成を未然に減らす、効率上の要所です。
③ ラスタライズ が単位変換の中心です。三角形が画面上で覆うピクセルを走査し、それぞれに対して フラグメント(そのピクセル位置における色計算の候補データ)を生成します。同時に、三角形の3頂点が持つ属性(色・UV・深度など)を、ピクセル位置に応じて 補間 します。透視投影では画面上の線形補間が3D 上の線形性と一致しないため、遠近補正(パースペクティブ補正)補間 が使われます。
フラグメントは「ある三角形がこのピクセルを覆ったときに生じる色計算の候補」であり、まだ画面のピクセルそのものではありません。半透明や重なりがあれば、1 つのピクセル位置に複数のフラグメントが生成されえます。それらを深度テストやブレンドでふるいにかけ、最終的に1色へ確定させるのが出力結合段です。つまりフラグメントは中間データ、ピクセルは最終結果、と区別します。
④ フラグメント処理 では、フラグメントごとにテクスチャをサンプリングし、ライティング計算を行って最終的な色(RGBA)を決めます。プログラマブルなフラグメントシェーダ(ピクセルシェーダ)の担当で、現代の描画の見た目の大半はここで作られます。フラグメント数はふつう頂点数よりはるかに多いため、パイプライン全体の計算負荷はこの段に集中しがち です。
⑤ 出力結合 は固定機能の最終段です。深度テスト(Z テスト)で手前・奥を判定して隠面を除去し、ステンシルテストでマスク処理を行い、アルファブレンドで半透明を既存のピクセルに合成して、結果をフレームバッファへ書き込みます。深度テストはフラグメントシェーダの後に行うのが基本ですが、シェーダが深度を変更しない場合は 早期深度テスト(Early-Z) としてシェーダ前に前倒しし、隠れるフラグメントの着色計算そのものを省くことができます。
固定機能段とプログラマブル段の区別
パイプラインの各段は、開発者がシェーダプログラムで挙動を書き換えられる「プログラマブル段」 と、ハードウェアが決まった処理を高速に行う「固定機能段」 に分かれます。この区別は、どこを自分で制御でき、どこは GPU に任せるしかないかを見極めるうえで実務的に重要です。
| 区分 | 代表的な段 | 挙動の決まり方 | ねらい |
|---|---|---|---|
| プログラマブル | 頂点シェーダ / フラグメントシェーダ | 開発者が書くシェーダコードで自由に決まる | 変換・陰影・表現の自由度 |
| 固定機能 | ラスタライズ / 深度・ステンシル / ブレンド | GPU 内蔵の専用回路で処理、パラメータ設定のみ | 決まった処理を最大速度で |
歴史的には、初期の GPU はパイプライン全体が固定機能でした。行列や光源をパラメータで与えるだけで、計算内容そのものは変えられませんでした。2000 年代前半に頂点シェーダとフラグメントシェーダが導入され、変換と陰影が プログラマブル になったことで表現の自由度が飛躍的に上がりました。以降、ジオメトリシェーダ・テッセレーション段・コンピュートシェーダなどが加わり、プログラマブルな領域は広がり続けています。
一方で、ラスタライズと出力結合(深度・ブレンド)は今も基本的に固定機能 のままです。三角形の被覆判定や深度比較は、全画面の膨大なピクセルに対して毎フレーム実行される定型処理であり、専用回路で行うほうが圧倒的に速く省電力だからです。汎用シェーダで自由に書けることと、専用回路で高速に処理することのトレードオフが、この線引きを決めています。
実務では、パイプラインを毎回ゼロから組むのではなく、シェーダ・ブレンド式・深度比較関数・カリング方向などをまとめて パイプラインステート として設定し、GPU に渡します。Vulkan や Direct3D 12 では、これを事前にコンパイルした「パイプラインステートオブジェクト」として固めることで、描画時の状態変更コストを下げます。どの段が固定機能でどこにフックできるかを把握しておくと、この設計が読み解きやすくなります。
GPU 上での並列実行 ── 段を大量のスレッドで埋める
このパイプラインが実用的な速度で回るのは、GPU が 同じ処理を大量のデータに同時適用する アーキテクチャだからです。頂点処理は「多数の頂点に同じ変換」を、フラグメント処理は「多数のフラグメントに同じ陰影計算」を適用します。まさにデータ並列であり、GPU の設計思想と一致します。
GPU は多数の演算コアをまとめ、同一の命令列を複数のデータ要素に対して並行実行 します。この実行モデルは SIMT(Single Instruction, Multiple Threads)と呼ばれ、数十スレッドを 1 束(NVIDIA のワープ、AMD のウェーブフロント)として、束の全スレッドが同じ命令を歩調をそろえて実行します。CPU が少数の高性能コアで低遅延を狙うのに対し、GPU は多数の単純コアで高スループットを狙う——この違いが描画に効きます。
SIMT 実行のイメージ(フラグメントシェーダ):
1 束(ワープ/ウェーブフロント)= 例: 32 スレッド
各スレッド = 1 フラグメントを担当し、全員が同じ命令を実行
命令: color = texture(tex, uv) * lighting;
thread0 → fragmentA に適用
thread1 → fragmentB に適用
…(32 個を一斉に)
分岐(if)で束内のスレッドが別方向へ進むと、
両方の経路を順に実行して不要側を無効化する(分岐ダイバージェンス)
→ 束内で条件が割れるほど実効効率が落ちる
段どうしの関係も並列性の観点で見ると理解が深まります。パイプラインは論理的には一方向の流れですが、GPU 上では 複数の段が同時に動いています。ある三角形群がラスタライズされている間に、次の頂点群は頂点シェーダで処理され、前の三角形のフラグメントは出力結合で書き込まれる——各段が絶えず仕事を持つよう、大量の作業で埋め続けるのが GPU の使い方です。
描画性能はパイプラインの中で最も詰まった段で決まります。頂点数が過大なら頂点処理(ジオメトリバウンド)、フラグメントの陰影が重い、あるいは高解像度で塗る面積が大きいならフラグメント処理(フィルレート/シェーダバウンド)、テクスチャ帯域が足りなければメモリバウンドになります。最適化はまず「どの段で詰まっているか」を特定してから行うべきで、闇雲にシェーダを削っても、律速が別段なら速度は変わりません。
「頂点シェーダとフラグメントシェーダの違い」を問われたら、処理の単位(頂点 対 フラグメント)と実行回数(頂点数 対 被覆ピクセル数)、そして間にラスタライズという固定機能段が挟まって単位が変換される、の3点を押さえると過不足なく答えられます。さらに「ラスタライズはなぜ固定機能か」に対しては、全画面で毎フレーム走る定型処理を専用回路で高速・省電力に行うため、と説明できると理解が伝わります。
まとめ
- 描画パイプラインは 頂点処理→プリミティブ組み立て→ラスタライズ→フラグメント処理→出力結合 の一方向の流れで、前段の出力が次段の入力になる組み立てラインである。
- ラスタライズが処理の単位を頂点からフラグメントへ変換する境界 で、フラグメントは中間の色計算候補、ピクセルは出力結合で確定した最終結果、と区別する。
- 頂点シェーダとフラグメントシェーダはプログラマブル段、ラスタライズと深度・ブレンドの出力結合は 固定機能段 で、自由度と専用回路の速度のトレードオフが線引きを決めている。
- GPU は SIMT で頂点・フラグメントを大量に同時処理 する高スループット型の実行機で、各段を膨大なスレッドで埋め、複数の段を同時に走らせることでリアルタイム描画を成立させる。
- 性能は最も詰まった段で決まるため、最適化は 律速段の特定 から始める。関連する GPU ハードウェアの位置づけは /hardware-components/ を参照。
グラフィックス Article
描画パイプラインの全体像(頂点→ラスタライズ→フラグメント)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
グラフィックス
比較で見る軸
難易度: advanced / カテゴリ: グラフィックス / タグ数: 5
導入後に効く点
頂点シェーダとフラグメントシェーダはプログラマブル段、ラスタライズと深度・ブレンドの出力結合は固定機能段で、両者は役割が明確に分かれる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- グラフィックス
- タグ数
- 5
判断チェックリスト
- 自社の用途が「グラフィックス / レンダリングパイプライン」に近いか確認する。
- 強みである「描画パイプラインは頂点処理→プリミティブ組み立て→ラスタライズ→フラグメント処理→出力結合の一方向の流れで、各段の出力が次段の入力になる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。