SharpVulkan で三角形描画


スポンサーリンク

最初の三角形描画

今回は3角形ポリゴンを描画するところを説明していきます。基本となるプログラムは前回の画面クリア処理で実装したものとなります。
差分で説明していきますので、ここから読み始める人はご注意ください。

イベントハンドラの接続

イベントハンドラの接続には以下のようになっています。

実際には初期化関数、リサイズ関数、と順番に呼び出されます。
その後は描画処理が定期的に呼ばれるという構造です。

初期化関数

初期化の関数の中は以下のようになっています。

見てわかるように、ステート情報の構築が比較的多めになっています。
SharpVulkan では一応初期値でそれなりに動くように値が入っていますが、それでも個々に設定が必要な部分があります。
そういった部分は各種メンバ関数に追い出しています。

頂点情報の設定

頂点バッファがどのような情報で構成されているのかを設定するのが VkPipelineVertexInputState です。
従来で言うところの頂点フォーマット関連のオブジェクトに相当します。

これを作成するメンバ関数は以下のように実装します。

頂点バッファの作成

頂点データは CreateVertexBuffer で作成しています。
この関数は以下のようになっています。初期頂点データは、確保したメモリに対してマップを実行してデータを書き込むという方法で設定します。

ここで使用しているヘルパ関数 SampleHelpers.CreateBuffer は以下のようになっています。

シェーダーについて

上記でシェーダーを設定している部分が既に登場していました。
これは glsl で書かれたシェーダーを glslangValidator を使って SPV 形式に変換済みのファイルを指定しています。

以下のように実行して作成していますが、 glslangValidator は Vulkan SDK のインストールが必要だと思います。

リサイズ関数

初期化関数で準備したリソースは基本的にウィンドウ解像度に依存しないものばかりでした。
ここのリサイズ関数の中では解像度に関係するものを初期化します。

ビューポートの設定と、コントロールが保持している RenderPass の情報から、今回使用するための GraphicsPipeline を生成します。
この生成関数は以下のようになっています。

このオブジェクトを生成するのにたくさんのステートが必要になっているのがわかるかと思います。

描画処理

今までに情報は構築したので、描画について説明していきます。

描画関数の中身は以下のようになっています。初期化に比べるとコード量は減っています。

vkCmdBeginRenderPass でレンダーパスを開始して、その中でグラフィックスパイプラインのバインドや、バッファのセットを行い、ポリゴンを描画するコマンドを積むだけです。

後始末

今回色々と作成したデータは終了前に破棄する必要があります。これらのコードは以下のようになっています。

sharp_vulkan_triangle01

まとめ

今回のコードは GitHub のほうにサンプルプロジェクトとして公開中です。
リポジトリはこちらになります。 https://github.com/techlabxe/VulkanSharpTutorial

シェアする

  • このエントリーをはてなブックマークに追加

フォローする