この記事は Introduction - Vulkan Tutorial の日本語訳です。
Introduction
ここからの数章を通して、三角形を描画するように設定されたグラフィックスパイプラインをセットアップしていきます。グラフィックスパイプラインとは、メッシュの頂点とテクスチャを、最終的にレンダーターゲットのピクセルに変換するまでの一連の操作のことです。単純化した概要を以下に示します。
インプットアセンブラ(input assembler)は、あなたが指定したバッファから生の頂点データを収集します。また、頂点データ自体を複製することなく、いくつかの要素をリピートするために、インデックスバッファを使うこともあります。
頂点シェーダ(vertex shader)は全ての頂点に対して実行され、一般的に、頂点位置をモデル座標からスクリーン座標に変更するような変換を適用します。また、頂点ごとのデータをパイプラインに伝えます。
テッセレーションシェーダ(tessellation shaders)では、メッシュのクオリティを向上するために、特定のルールに従ってジオメトリを分割できます。これは、レンガの壁や階段などに近づいたときに、平坦でないように見せるためによく使われます。
ジオメトリシェーダ(geometry shader)は全てのプリミティブ(三角形、直線、点)に対して実行され、それを破棄したり、さらに追加のプリミティブを出力したりできます。これはテッセレーションシェーダと似ていますが、よりフレキシブルです。しかし、Intelの統合GPUを除く、ほとんどのグラフィックスカードにおいてあまり良いパフォーマンスを発揮しないため、こんにちのアプリケーションではあまり使われていません。
ラスタライゼーション(rasterization)ステージはプリミティブをフラグメント(fragments)に離散化します。これはフレームバッファを満たすピクセル要素です。スクリーン外のフラグメントは破棄され、頂点シェーダから出力されたアトリビュートは、図のように、フラグメント間で補間されます。通常、他のプリミティブのフラグメントの後ろにあるフラグメントは、デプステストによって破棄されます。
フラグメントシェーダ(fragment shader)は生き残ったフラグメント全てに対して呼び出され、どのフレームバッファに、どの色とデプス値でフラグメントが書き込まれるかを決定します。これには頂点シェーダから補間されたデータを使うことができ、テクスチャ座標やライティングのための法線などを含みます。
カラーブレンド(color blending)ステージは、フレームバッファの同じピクセルにマッピングされる、異なるフラグメントをミックスする操作を適用します。フラグメントは単純に上書きすることも、加算することも、透明度に基づいて混合することもできます。
緑色のステージは固定機能ステージと呼ばれます。これらのステージは、パラメータによって動作を微調整することができますが、動作方法はあらかじめ決められています。
いっぽう、オレンジ色のステージはプログラマブル(programmable
)で、あなたが行いたい操作をそのまま適用するために、あなた自身のコードをグラフィックスカードにアップロードすることができます。これによって、例えばテクスチャリングやライティングからレイトレースまで、フラグメントシェーダで何でも実装することができます。これらのプログラムはたくさんのGPUコアで同時に実行され、頂点やフラグメントといった多くのオブジェクトを並列に処理します。
もしあなたが以前にOpenGLやDirect3Dといった古いAPIを使ったことがあるなら、glBlendFunc
やOMSetBlendState
などを呼び出すことによって、パイプラインの設定を自由に変更できるのに慣れていることだろうと思います。Vulkanのグラフィックスパイプラインはほぼ完全に変更不可ですので、シェーダ、フレームバッファのバインド、ブレンド関数などを変更したいときには、スクラッチからパイプラインを再作成しないといけません。これの欠点は、あなたがレンダリング処理で使いたいステートの全ての組み合わせを表す、多数のパイプラインを作成する必要があることです1。しかし、パイプラインで行われる処理のすべてがあらかじめわかることによって、ドライバはより最適化を行うことができます。
いくつかのプログラマブルステージはオプションで、何を行いたいかによって使用するかどうかを切り替えることができます。例えば、テッセレーションステージとジオメトリステージは、シンプルなジオメトリを描画するだけなら無効にすることができます。もしデプス値にしか興味がないのであれば、フラグメントシェーダステージをオフにすることができ、これはシャドウマップを生成するときに有効です。
次の章では、三角形を画面に描画するために必要な2つのプログラマブルステージ、頂点シェーダとフラグメントシェーダを作成します。ブレンドモード、ビューポート、ラスタライゼーションといったような固定機能の設定は、その次の章でセットアップします。Vulkanのグラフィックスパイプラインのセットアップの最後は、入力と出力のフレームバッファの設定です。
createGraphicsPipeline
関数を追加して、initVulkan
のcreateImageViews
のすぐ後に呼び出すようにします。私たちは、続く章でこの関数を作成していきます。
void initVulkan() {
createInstance();
setupDebugMessenger();
createSurface();
pickPhysicalDevice();
createLogicalDevice();
createSwapChain();
createImageViews();
createGraphicsPipeline();
}
...
void createGraphicsPipeline() {
}
前の記事
次の記事
-
訳注:Vulkan 1.3で動的に設定できるステートが追加され、以前よりはパイプラインの数を抑えることが可能になりました。 ↩