6

スワップチェーンでサポートされているイメージ形式を取得するために使用vkGetPhysicalDeviceSurfaceFormatsKHRし、(Linux+Nvidia では SDL を使用して)VK_FORMAT_B8G8R8A8_UNORM最初のオプションとして取得し、先に進み、その形式でスワップチェーンを作成します。

VkSwapchainCreateInfoKHR swapchain_info = {
    ...
    .imageFormat = format, /* taken from vkGetPhysicalDeviceSurfaceFormatsKHR */
    ...
};

これまでのところ、それはすべて理にかなっています。画面に描画するために使用される画像フォーマットは、通常のチャネルあたり 8 ビットの BGRA です。

私の学習プロセスの一環として、私はこれまで多くのものを設定することに到達しましたが、まだグラフィックス パイプライン1を設定していません。したがって、パイプラインを必要としない、使用できる唯一のコマンドを試しています: vkCmdClearColorImage2

VkClearColorValueクリア カラーを定義するために使用される は、イメージの形式に応じて 、または として色を取得できfloatますuint32_tint32_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
  • コマンドバッファをキューに送信します(セマフォを使用したスワップチェーンとの同期を処理します)
  • プレゼンテーションのために提出する
4

1 に答える 1

4

私の質問は、画像形式が VK_FORMAT_B8G8R8A8_UNORM の場合、フロートでクリアカラーを指定する必要があるのはなぜですか?

正規化された、スケーリングされた、または sRGB の画像形式は、実際にはさまざまな形式の浮動小数点圧縮にすぎないためです。正規化された整数は、範囲 [0, 1] または [-1, 1] の浮動小数点値を格納する方法ですが、使用するデータ量は 16 ビット浮動小数点数よりもはるかに少なくなります。スケーリングされた整数は、範囲 [0, MAX] または [-MIN, MAX] の浮動小数点値を格納する方法です。また、sRGB は [0, 1] の範囲の線形カラー値を格納する圧縮された方法にすぎませんが、線形カラー値が示唆するよりも異なる場所に精度を置くガンマ補正された色空間にあります。

頂点シェーダーへの入力でも同じことがわかります。vec4入力タイプは、浮動小数点形式だけでなく、正規化された形式でも提供できます。

于 2016-05-06T03:10:49.730 に答える