3-3. レンダーパス

描画の対象となる場所ができたので、ここからは実際の描画処理になります。

描画をするにあたっては、まずレンダーパスというものが必要です。レンダーパスとは一言で言えば描画の処理順序を記述したオブジェクトで、Vulkanにおける描画処理の際には必ず必要になります。

レンダーパスの情報を構成するものは3つあります。それぞれ「アタッチメント」「サブパス」「サブパス依存性」です。

アタッチメントはレンダーパスにおいて描画処理の対象となる画像データのことで、書き込まれたり読み込まれたりします。

サブパスは1つの描画処理のことで、単一または複数のサブパスが集まってレンダーパス全体を構成します。サブパスは任意の個数のアタッチメントを入力として受け取り、任意の個数のアタッチメントに描画結果を出力します。

サブパス依存性はサブパス間の依存関係、つまり「サブパス1番が終わってからでないとサブパス2番は実行できない」とかそういう関係を表します。

有向グラフとして考えてみると分かりやすいでしょう。以下は一例です。

複雑なレンダーパスで複雑な描画処理を表現することもできるのですが、今回は1つのサブパスと1つのアタッチメントだけで構成される単純なレンダーパスを作成します。

模式図としてはシンプルなのですが、それでもコードに直すと分量がえげつなくなります。実態はシンプルなので面食らわないようにしましょう。レンダーパスは vk::DevicecreateRenderPassメソッドで作成できます。

初期化用構造体のメンバには今の知識だとまだ説明の難しいものもありますが、このコードでサブパスとアタッチメントの接続関係が表現されていることをなんとなく分かってもらえれば十分です。なお、 vk::AttachmentReference構造体の attachmentメンバは「何番のアタッチメント」という形でレンダーパスの中のアタッチメントを指定します。ここでは0を指定しているので0番のアタッチメントの意味です。

 

これでレンダーパスが作成できた訳ですが、レンダーパスはあくまで「この処理はこのデータを相手にする、あの処理はあのデータを~」という関係性を表す”枠組み”に過ぎず、それぞれの処理(=サブパス)が具体的にどのような処理を行うかは関知しません。実際には任意のコマンドを任意の回数呼ぶことができます。

描画を行うにはレンダーパスの使い方だけではなく、レンダーパスの中で呼び出す描画のためのコマンドについても学ばなければならないので、以降それをやっていきます。


この節ではレンダーパスの作成をやりました。次節ではパイプラインの作成をやります。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です