2016-09-11 4 views
0

他の寸法は正確に幅*高さ* 4バイトを取る一方、フォーマットR8G8B8A8_UNORMのサイズ500x500の画像は8000バイトのメモリを追加するという奇妙な動作をしています。ホスト・可視画像に特定の寸法の画像に奇妙なメモリサイズがあります

  1. 描画色アタッチメント
  2. コピーカラーアタッチメントと(すべてのレイアウトに遷移した後に)それをマップ:私は次のことをやっています。マッピングの前にホスト可視画像のメモリ要件をチェックするとき

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 
}; 
+1

アラインメントの理由から、行の長さがパディングによって2の累乗の倍数に増加することがあります。幅500,501,502 ...を試してパターンを見つけてください。与えられた場合、幅は500を除いて8ピクセル(32バイト)の倍数です。次の倍数は504です。 –

+0

@ YvesDaoustはい、そうです。 w = 504の場合、画像はきれいに見えます。ですから、私は 'padding =(required_size - computed_size)/ width/4'を計算するだけです。あなたがあなたの答えをチェックインすると、私はそれを感謝して受け入れます。 **編集**:はい、あなたのルーチンは理にかなっています。ありがとう! –

+0

"*最後のケースの結果画像が不正です。*"どうやって不正な形式になっているのですか? –

答えて

1

だから私は(=私はちょうどパディングを計算します推測required_size - 計算されたサイズ)/ width/4。

バルカンはvkGetImageSubresourceLayoutを介して(線形タイルと)画像のレイアウトを照会するのを可能にします。テクスチャをマップしてそのビットにアクセスしようとしたときに、であったはずです。

VkSubresourceLayoutは、イメージの行ピッチ(つまり、その直下または上のピクセルに到達するためにオフセットする必要があるバイト数)を示します。この値はではありませんは、幅*ピクセルサイズにする必要はありません。 にはにアクセスする必要があります。

+0

このメソッドは 'vkGetImageSubresourceLayout'と呼ばれ、それ以外の場合は正常に動作します。どうもありがとう。 –

関連する問題