スワップチェーンでサポートされているイメージ形式を取得するために使用vkGetPhysicalDeviceSurfaceFormatsKHR
し、(Linux+Nvidia では SDL を使用して)VK_FORMAT_B8G8R8A8_UNORM
最初のオプションとして取得し、先に進み、その形式でスワップチェーンを作成します。
VkSwapchainCreateInfoKHR swapchain_info = {
...
.imageFormat = format, /* taken from vkGetPhysicalDeviceSurfaceFormatsKHR */
...
};
これまでのところ、それはすべて理にかなっています。画面に描画するために使用される画像フォーマットは、通常のチャネルあたり 8 ビットの BGRA です。
私の学習プロセスの一環として、私はこれまで多くのものを設定することに到達しましたが、まだグラフィックス パイプライン1を設定していません。したがって、パイプラインを必要としない、使用できる唯一のコマンドを試しています: vkCmdClearColorImage
2。
VkClearColorValue
クリア カラーを定義するために使用される は、イメージの形式に応じて 、または として色を取得できfloat
ますuint32_t
。int32_t
スワップチェーンに指定された画像形式に基づいて、値を指定する必要があると予想していましたuint32_t
が、それは正しくないようです。画面の色が変わらないのでわかります。私はそれを与えてみましたがfloat
、うまくいきます。
float
私の質問は、画像形式が s の場合、なぜクリアカラーを s で指定する必要があるのVK_FORMAT_B8G8R8A8_UNORM
ですか?
1 実際には持っていますが、最初にパイプラインのない単純なケースを試してみようと思いました. 私は Vulkan を段階的に使用しようとしています (その冗長性を考慮して) 特に、学習しながら Vulkan に関するチュートリアルも書いているためです。
2 実際には、技術的にはレンダー パスは必要ありませんが、ここではパイプラインを使用していないので、パイプラインなしで試してみましょう。
私のレンダリングループは基本的に次のとおりです。
- スワップチェーンから画像を取得
- 次のコマンド バッファを作成します。
VK_IMAGE_LAYOUT_UNDEFINED
からへの移行VK_IMAGE_LAYOUT_GENERAL
(レンダー パスの外側のイメージをクリアしているため)- 画像をクリア
VK_IMAGE_LAYOUT_GENERAL
からへの移行VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
- コマンドバッファをキューに送信します(セマフォを使用したスワップチェーンとの同期を処理します)
- プレゼンテーションのために提出する