2017-07-31 215 views
0

當我們動態生成mipmap時,什麼應該是VkImageBlit.dstOffsets和VkImageBlit.srcOffsets的參數? 我正在一層一層地爲每個mipmap級別做一些準備工作,但大多數情況下我會考慮偏移。所以我有數據,它具有所有與第0個mipmap級別相關的六個面。使用vkCmdBlitImage生成立方體貼圖紋理

for(int j=0; j< bufferCopyRegions.size(); j++) { 

    for (int32_t i = 1; i < mipLevels; i++) 
    { 

     VkImageBlit imageBlit{}; 

     // Source 
     imageBlit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 
     imageBlit.srcSubresource.layerCount = 1; 
     imageBlit.srcSubresource.mipLevel = 0; 

     imageBlit.srcOffsets[1].x = bitmapInfos[j].width; 
     imageBlit.srcOffsets[1].y = bitmapInfos[j].height; 
     imageBlit.srcOffsets[1].z = 1; 

     // Destination 
     imageBlit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 
     imageBlit.dstSubresource.layerCount = 1; 
     imageBlit.dstSubresource.mipLevel = i; 


     imageBlit.dstOffsets[1].x = int32_t(bitmapInfos[j].width >> (i) == 0 ? 1 : int32_t(bitmapInfos[j].width >> (i))); 
     imageBlit.dstOffsets[1].y = int32_t(bitmapInfos[j].height >> (i) == 0 ? 1 : int32_t(bitmapInfos[j].height >> (i))); 
     imageBlit.dstOffsets[1].z = 1; 

     VkImageMemoryBarrier imageMemoryBarrier = {}; 
     imageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; 
     imageMemoryBarrier.pNext = NULL; 
     imageMemoryBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 
     imageMemoryBarrier.subresourceRange.baseMipLevel = i; 
     imageMemoryBarrier.subresourceRange.levelCount = 1; 
     imageMemoryBarrier.subresourceRange.baseArrayLayer = j; 
     imageMemoryBarrier.subresourceRange.layerCount = 1; 

     // change layout of current mip level to transfer dest 
     setImageLayout(imageMemoryBarrier, 
         blitCmd, 
         image, 
         VK_IMAGE_ASPECT_COLOR_BIT, 
         VK_IMAGE_LAYOUT_UNDEFINED, 
         VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, imageMemoryBarrier.subresourceRange, 
         VK_PIPELINE_STAGE_TRANSFER_BIT, 
         VK_PIPELINE_STAGE_HOST_BIT); 

     // Do blit operation from previous mip level 
     vkCmdBlitImage(blitCmd, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image, 
       VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &imageBlit, VK_FILTER_LINEAR); 


     setImageLayout(imageMemoryBarrier, blitCmd, image, VK_IMAGE_ASPECT_COLOR_BIT, 
         VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 
         VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, imageMemoryBarrier.subresourceRange, 
         VK_PIPELINE_STAGE_HOST_BIT, 
         VK_PIPELINE_STAGE_TRANSFER_BIT); 
    } 
} 
+0

考慮到它在被指出後會有多少意外,請自動聲明已啓用驗證圖層(並在您的Q中包含警告或錯誤報告) – krOoze

回答

1

我沒有看到imageBlit.srcSubresourceimageBlit.dstSubresource一套baseArrayLayerj。這可能是你的直接問題。

另外你的障礙對我來說似乎不好。只有頂部的mip需要與主機同步。但即使如此,VK_PIPELINE_STAGE_HOST_BIT應該不是是必要的,因爲vkQueueSubmit說有一個例外,如果主機寫入在被調用之前結束(6.9. Host Write Ordering Guarantees並在6.1.3. Access Types的註釋中提醒),它會隱式執行這種同步。

+1

此處不需要使用host_stage,因爲當subşitting命令緩衝區 –

+0

@AntoineMorrier權利隱含地完成障礙。忘記了這個規則。合併。謝謝。 – krOoze