他の寸法は正確に幅*高さ* 4バイトを取る一方、フォーマットR8G8B8A8_UNORMのサイズ500x500の画像は8000バイトのメモリを追加するという奇妙な動作をしています。ホスト・可視画像に特定の寸法の画像に奇妙なメモリサイズがあります
- 描画色アタッチメント
- コピーカラーアタッチメントと(すべてのレイアウトに遷移した後に)それをマップ:私は次のことをやっています。マッピングの前にホスト可視画像のメモリ要件をチェックするとき
THSは、しかし、正常に動作し、私は次のような結果を得る:
- =ワット1000年1000年、H =:4,000,000バイト
- W = 600、H = 600:144万バイト
- 500 = W、H = 500:1008000バイト(これは1,000,000であるべきである)
最後のケースの結果イメージが不正です。 w * h * 4以外のメモリサイズのために異なる数式になる可能性があることが分かりません。ホスト可視画像は線形タイリングを持ち、vkMapMemoryコマンドの前にレイアウトVK_IMAGE_LAYOUT_GENERAL
に遷移しました。
これは、色の添付ファイルの作成先である:
VkImageCreateInfo color_image_info = {
VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // sType,
nullptr, // pNext (see documentation, must be null)
0, // image flags
VK_IMAGE_TYPE_2D, // image type
this->color_format_, // image format
{this->render_width_, this->render_height_, 1}, // image extent
1, // level of detail = 1
1, // layers = 1
VK_SAMPLE_COUNT_1_BIT, // sampling
VK_IMAGE_TILING_OPTIMAL, // optimal tiling
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // used for color
VK_SHARING_MODE_EXCLUSIVE, // sharing between queue families
1, // number queue families
&this->queue_family_index_, // queue family index
VK_IMAGE_LAYOUT_PREINITIALIZED // initial layout
};
そして、これは、ホスト・可視画像です:
VkImageCreateInfo host_visible_image_info = {
VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // sType,
nullptr, // pNext (see documentation, must be null)
0, // image flags
VK_IMAGE_TYPE_2D, // image type
this->color_format_, // image format
{this->render_width_, this->render_height_, 1}, // image extent
1, // level of detail = 1
1, // layers = 1
VK_SAMPLE_COUNT_1_BIT, // sampling
VK_IMAGE_TILING_LINEAR, // linear tiling
VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, // used for color
VK_SHARING_MODE_EXCLUSIVE, // sharing between queue families
1, // number queue families
&this->queue_family_index_, // queue family index
VK_IMAGE_LAYOUT_PREINITIALIZED // initial layout // TODO: !!!Find out whether this has to be transisition first
};
アラインメントの理由から、行の長さがパディングによって2の累乗の倍数に増加することがあります。幅500,501,502 ...を試してパターンを見つけてください。与えられた場合、幅は500を除いて8ピクセル(32バイト)の倍数です。次の倍数は504です。 –
@ YvesDaoustはい、そうです。 w = 504の場合、画像はきれいに見えます。ですから、私は 'padding =(required_size - computed_size)/ width/4'を計算するだけです。あなたがあなたの答えをチェックインすると、私はそれを感謝して受け入れます。 **編集**:はい、あなたのルーチンは理にかなっています。ありがとう! –
"*最後のケースの結果画像が不正です。*"どうやって不正な形式になっているのですか? –