やっていくVulkan入門

5. シェーダにデータを与える

この章では、シェーダに計算のためのデータを外から与える方法について学びます。これまでのコードでは、頂点の位置などの数値はシェーダ内に埋め込んでいました。こんな実装はもちろん実用的ではありません。

頂点の座標や色など、表示する3Dモデルを表す情報は、普通はシェーダとは別にデータとして読み込んでシェーダに与えます。

この章では4章までで作成した「三角形を表示する」プログラムを、「外から与えたデータを用いて三角形を描く」ようにすることが目標です。任意のデータを使ってポリゴン=三角形の集合を描くことができるようになれば、モデルの表示などは目前です。

さて、重要なことですがシェーダは普通のプログラムと違い、CPU上ではなくGPU上で動くプログラムです。そのため、普通のメモリ上にある変数の値などは基本的に読み込めません

シェーダにデータを渡すためには、データをGPUからアクセスできるメモリ(いわゆるVRAMなど)に置いておく必要があります。こうしたGPUからアクセスできるようなメモリのことを、Vulkanにおいてはデバイスメモリと呼びます。

デバイスメモリを自由に操作できるようになるため、この章では「バッファ」の使い方について解説していきます。バッファとは、デバイスメモリ上のデータ列を表すオブジェクトです。デバイスメモリ上のデータを管理し、シェーダに受け渡したりするためには必要不可欠の存在となります。

またシェーダにデータを読み込ませる際、データだけ送ってハイ終わりという訳にはいきません。シェーダがデータをきちんと解釈できるようにするには、目的となるデータの読み込み方をシェーダに教える必要があります。このために用意する「説明書き」のようなものとして「デスクリプション」「デスクリプタセット」といったオブジェクトが存在します。パイプラインにこれらの情報を付け加えることで、初めてシェーダからデータが読めるようになります。

この章では主に「バッファ」と「デスクリプタ」について説明することになります。

最後にもうひとつ。シェーダに外からデータを与える場合、(当然かもしれませんが)シェーダの側も外から読み込んだデータを利用するようなプログラムを書く必要があります。この章ではその書き方についても説明していきます。