2017-06-22 4 views
-1

Ich habe die anderen Fragen zu diesem Thema, aber sie beantworten meine Frage nicht, also hier geht es. Ich benutze die Funktion vkCmdCopyImageToBuffer und bekomme eine Speicherzugriffsverletzung und verstehe nicht warum. Hier ist der Code.Vulkan Kopieren Bild von Swap-Kette

  VkBufferImageCopy region = {}; 
      region.bufferOffset = 0; 
      region.bufferRowLength = width; 
      region.bufferImageHeight = height; 
      region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 
      region.imageSubresource.mipLevel = 0; 
      region.imageSubresource.baseArrayLayer = 0; 
      region.imageSubresource.layerCount = 1; 
      region.imageOffset = { 0, 0, 0 }; 
      region.imageExtent = { 
       width, 
       height, 
       1 
      }; 

      vkCmdCopyImageToBuffer(m_drawCmdBuffers[i], m_swapChain.buffers[i].image, 
       VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, m_renderImage, 1, &region); 

Die swapchain Bilder werden hier im Initialisierungscode erstellt:

// Get the swap chain images 
    images.resize(imageCount); 
    VK_CHECK_RESULT(fpGetSwapchainImagesKHR(device, swapChain, &imageCount, images.data())); 

    // Get the swap chain buffers containing the image and imageview 
    buffers.resize(imageCount); 
    for (uint32_t i = 0; i < imageCount; i++) 
    { 
     VkImageViewCreateInfo colorAttachmentView = {}; 
     colorAttachmentView.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; 
     colorAttachmentView.pNext = NULL; 
     colorAttachmentView.format = colorFormat; 
     colorAttachmentView.components = { 
      VK_COMPONENT_SWIZZLE_R, 
      VK_COMPONENT_SWIZZLE_G, 
      VK_COMPONENT_SWIZZLE_B, 
      VK_COMPONENT_SWIZZLE_A 
     }; 
     colorAttachmentView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 
     colorAttachmentView.subresourceRange.baseMipLevel = 0; 
     colorAttachmentView.subresourceRange.levelCount = 1; 
     colorAttachmentView.subresourceRange.baseArrayLayer = 0; 
     colorAttachmentView.subresourceRange.layerCount = 1; 
     colorAttachmentView.viewType = VK_IMAGE_VIEW_TYPE_2D; 
     colorAttachmentView.flags = 0; 

     buffers[i].image = images[i]; 

     colorAttachmentView.image = buffers[i].image; 

     VK_CHECK_RESULT(vkCreateImageView(device, &colorAttachmentView, nullptr, &buffers[i].view)); 
    } 

Und mein Puffer Ähnlich hier erstellt:

    VkBufferCreateInfo createinfo = {}; 
     createinfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; 
     createinfo.size = width * height * 4 * sizeof(int8_t); 
     createinfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; 
     createinfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; 

     //create the image copy buffer 
     vkCreateBuffer(m_device, &createinfo, NULL, &m_renderImage); 

Ich habe versucht, verschiedene Pixelformate und unterschiedliche createinfo. Nutzungseinstellungen, aber keine Hilfe.

+0

Was ist ein "swap chain buffer"? Das ist kein von Vulkan definiertes Konzept. –

+0

Diese Objekte werden den Swapchain-Images zugeordnet, die von der Funktion fpGetSwapchainImagesKHR() abgerufen werden. Wenn ich die Bilder der Tauschkette nicht richtig erhalte, lassen Sie es mich wissen. –

Antwort

0

definiert die Einschränkungen für die Verwendung der VkImage s, die von der Swap-Kette erstellt wurden. Die einzige, die garantiert unterstützt wird, ist Farbanhang; alle anderen, einschließlich Übertragung src, sind optional.

Daher sollten Sie nicht davon ausgehen, dass Sie von einem darstellbaren Bild kopieren können. Wenn Sie sich dazu gezwungen sehen, müssen Sie zuerst diesen Wert abfragen. Wenn es keine Kopien erlaubt, müssen Sie zu Ihrem eigenen Bild rendern, von dem Sie kopieren. Sie können von diesem Bild in das darstellbare Bild rendern, wenn Sie es präsentieren möchten.

+0

Ich habe mir meinen Code angeschaut und der vkCmdBeginRenderPass zeigt keine VkImage Zieloption an. Das Renderpass-Objekt, das sich in der Info befindet, enthält ebenfalls keine Zielinformationen. Dies zeigt an, dass die Bilder der Tauschkette das Standardziel sind. Wie rende ich manuell auf einem vkImage, nachdem mein renderpass fertig ist. Wenn Sie bitte Beispielcode bereitstellen oder auf ein Tutorial verweisen könnten, das dasselbe tut. –

+0

@AnthonyDaniels: Regel Nr. 3 über Vulkan: Es gibt keine Standardwerte *. Sie müssen * alles * über das System angeben. In diesem Fall werden die Bilder, die als Anhänge in einer Render-Pass-Instanz verwendet werden, vom 'VkFramebuffer'-Objekt angegeben, das Sie an' vkCmdBeginRenderPass' übergeben haben. –