2025-10-14 19:45:37
諏訪子
gamedev
graphics
vulkan

【Vulkan】グラフィックスパイプラインの概要

最近、あたしはアセンブリについて沢山書いています。
何故なら、其れがとても楽しい物だからです。
でも今回は少し休憩して、グラフィックスプログラミングについて議論しましょう。
此の記事は理論に焦点を当て、特にグラフィックスパイプラインについて説明します。

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

グラフィックスパイプラインは、GPUがグラフィックスを処理し、貴方が画面上で見るプロセスです。
以下のグラフィックで、GPUが最終結果を画面に表示する前に通過する各ステップを見つける事が出来ます:
Vulkanのパイプライン

先ず、コードで頂点を入手する事から始まります。
此れはCやC++の様な言語で書く事も出来ますが、.obj、.fbx、.glb等のモデルファイルを通じて行う事が遥に一般的です。
此れらの頂点は頂点バッファとインデックスバッファに由来し、インプットアセンブラを通過します。
此れは固定機能です。

インプットアセンブラは、数値のリストを入力として受け取り、其れらを幾何学にグループ化します。
3Dモデリングプログラムでは、四角形(クアッド)を使用する事が一般的です。
何故なら、人が扱い易く、アニメーションやテクスチャリングが簡単で、見た目も綺麗だからです。
然し、コンピュータは三角形を使用し、1つのクアッドは2つの三角形に相当します。

次に、頂点シェーダーが各頂点を個別に処理し、回転や移動等の変換を行います。
テッセレーションシェーダーは、特定のルールに基づいて幾何学を細分化し、メッシュの品質を向上させます。
此れにより、近くにある平らなオブジェクトがよりリアルに見える様に成ります。
此れは完全に任意です。

ジオメトリシェーダーは、毎回プリミティブ(三角形、線、点など)に対して実行され、其れを取り消したり、入力された物より多くのプリミティブを出力したり出来ます。
ある意味、此れはテッセレーションシェーダーに似ていますが、遥に柔軟です。
然し、此れは殆どのグラフィックカードにとって非常に負荷が高い為、今日では殆ど使用されていません。
テッセレーションシェーダーと同様に、此れは完全に任意です。

ラスタライゼーションステージでは、幾何学が三角形が重なる各ピクセルに対してフラグメントに分割されます。

フラグメントシェーダーは各フラグメントを個別に処理し、テクスチャ、ノーマル、ライティング等の補間データを用いて色等の値を生成します。

最後に、カラーブレンディングステージは、同じピクセルに対応する複数のフラグメントからの値を混合する操作を適用します。
此れら全てが終わると、画像がフレームバッファに表示され、此れが貴方が画面で見る物です。

関数の種類

関数の種類は2つあります:

  • 固定機能(緑色でマークされています)。
  • プログラマブルステージ(紫色でマークされています)。

プログラマーは固定機能ステージで行われる操作について制御が少ないです。
各ステージは、ステージの動作を変更する変数を設定する事で構成出来ます。
インプットアセンブラ、ラスタライゼーション、カラーブレンディングはすべて固定機能です。

プログラマブルステージでは、GPUで実行される独自のコードをアップロードする能力があります。
GPU上で動作するこれらの小さなプログラムはシェーダーと呼ばれ、C言語に似た言語で書かれます。
多くの異なるシェーダー言語があり、GLSL、HLSL、MSL、Slang等があります。
シンプルにするために、GLSLだけに慣れましょう。
DirectXを使用したり、UnityやUnreal(此の記事を読んでいるなら恐らく使用していないでしょう)の様なエンジンを使用する場合は、HLSLを使用する事に成り、其れはC++やC#に似ています。

コンピュートシェーダー

GLSLチュートリアルシリーズを読んだら、コンピュートシェーダーという別のタイプのシェーダーがある事を知っているでしょう。
然し、此れらはグラフィックスパイプラインの一部ではなく、グラフィックスのレンダリングには使用されません。

CPUでレンダリングしない理由は?

技術的にはCPUでレンダリングする事は可能ですが、此れは非常に遅いです。
CPUは一度に1つの頂点しか処理出来ませんが、GPUは数千の頂点を並列で処理出来ます。
然し、注意点があります。
GPUでプログラムを書く場合、出来る事は大幅に制限されます。
CPUと同じ様にGPUのコードを書く事は出来ません。
何故なら、ハードウェアが根本的に異なるからです。
其の為、事前に定義されたグラフィックスパイプラインの枠組み内で作業する必要があります。

以上