SharpVulkan 初めてのテクスチャ


スポンサーリンク

テクスチャを貼ります

今回はテクスチャを貼ってみたいと思います。
ただ画像フォーマットは結構面倒くさい部分であるので、サンプルコードのほうには最低限しか実装していません。
サンプル理解が終わった後は、有名なテクスチャロードのライブラリや画像ロードのライブラリを使って行くことになるかなと思います。
(C# で簡単に使えるいいテクスチャライブラリが見つからなかったので自作してしまいましたが・・・)

頂点バッファ

今まで頂点データとして位置とカラーでしたが、今回は位置とUV値としました。

このデータに合うように CreateVertexInputState 関数の中身を修正しましょう。

テクスチャの準備

今回は tga ファイルから解像度と実データを取得するため SimpleTgaReader を作りました。
解像度と実データを元に、 VkImage, VkImageView, VkSampler を作成していきます。

今までの頂点バッファらと似ている部分もありますが、テクスチャならではの部分があります。
それが VkImageView と サンプラーでしょう。

CreateTexture 関数の中でも処理が詰まっています。ここでの引用は避けますが、流れだけは説明しておきます。
テクスチャをデバイスのローカルメモリにおいて使いたいため、またその領域は直接操作することができないため、ステージングバッファ経由でデータを転送することになります。
このときに、 vkCmdCopyBufferToImage を用いて、イメージとしてのデータに変更します。
あとは、以前やったようにメモリの情報を再セットして、テクスチャとして有効な状態にします。

ディスクリプタの準備

ディスクリプタの準備がちょっと変わります。以前は定数バッファを1つでしたが、今回はテクスチャ用の設定も必要になるのでディスクリプタは2つ必要になります。

ディスクリプタプールの準備は以下のようになります。

そしてディスクリプタセットレイアウトのほうは以下のようになります。
テクスチャ(サンプラ)のデータはバインディング1に設定するようにしています。

続いて、既に生成してある定数バッファやサンプラーから使用するディスクリプタを作ります。

描画

実は先のディスクリプタの構成まで終わってしまうと、描画の方は前のコードを変更しなくても問題ないです。
サンプルコードのほうでは4角形にするために設定を変更した程度です。

sharp_vulkan_tex0

シェアする

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

フォローする