2016-09-18 1 views
2

J'ai su que framebuffer est la destination finale du pipeline de rendu et swapchain contient beaucoup d'image. Alors, quelle est la relation entre ces deux choses? Lequel est la cible de rendu réelle? Et le framebuffer attache plus tard l'image finale de l'image en cours sur la vue de l'image? Si oui, comment va-t-il le transférer? La description de ceci par l'intermédiaire de la peinture ou du diagramme serait heureuse.Quelle est la différence entre framebuffer et image dans Vulkan?

+2

"* Je savais que framebuffer est la destination finale du pipeline de rendu *" A 'VkFramebuffer' n'est pas la" destination finale "pour quoi que ce soit. Ce que vous affichez est défini par vos sous-images, qui référencent les images dans un 'VkFramebuffer'. Mais le 'VkFramebuffer' lui-même ne fait vraiment rien. Il semble que vous parlez de quelque chose comme le framebuffer par défaut d'OpenGL. –

+0

Eh bien, peut-être que je suis juste habitué à OpenGL. Alors lequel collecter des images? Je pensais que swapchain les collectionner. Ai-je mal compris quelque chose? – EkBumYe

Répondre

11
  • VkFramebuffer + VkRenderPass définit la cible de rendu.

  • La passe de rendu définit la pièce jointe qui sera écrite avec des couleurs.

  • VkFramebuffer définit ce qui est d'être VkImageView qui fixation.

  • VkImageView définit la partie de VkImage à utiliser.

  • VkImage définit VkMemory et un format du texel.


Ou peut-être dans l'ordre inverse:

  • VkMemory est juste une séquence de N octets en mémoire.

  • VkImage objet s'y ajoute par ex. des informations sur le format (donc vous pouvez vous adresser par texels, pas bytes).

  • objet VkImageView aide une partie de sélection de la VkImage (comme stringView, arrayView ou whathaveyou) peuvent également aider à correspondre à une interface de incompatibles (en convertissant le format à la volée).

  • VkFramebuffer se lie à un VkImageView avec une pièce jointe .

  • VkRenderpass définit qui l'attachement sera tiré au sort dans

Il est pas comme vous ne l'utilisez pas une image. Vous faites, à travers le Vulkan Framebuffer.

L'image de la Swapchain n'est pas différente de toute autre image. Sauf que le pilote est le propriétaire de l'image. Vous ne pouvez pas le détruire directement ou l'allouer vous-même. Vous venez de l'emprunter au conducteur pour la durée entre l'acquisition et l'opération actuelle.

Il y a (généralement) plus d'images swapchain à des fins de mise en mémoire tampon et de rendu anticipé. AFAIK vous auriez besoin d'un VkFramebuffer séparé pour chaque image (est ennuyeux, mais plus en phase avec ce qui se passe réellement en dessous).

(Il y a certainement un diagramme assez dans ce peut-être plus tard ....)

+2

Belle explication. Fournissez ce joli diagramme aussi. – pcoder

3

Probablement la meilleure phrase de la spécification Vulkan qui décrit framebuffers est:

Les vues d'image spécifiques qui seront utilisé pour les pièces jointes, et leurs dimensions, sont spécifiés dans les objets VkFramebuffer.

Oui, vous auriez besoin d'un objet VkFramebuffer pour chaque image dans un swapchain, mais vous généralement besoin d'allouer une seule VkMemory pour un tampon de profondeur VkImage puis ajoutez le VkImageView pour ce tampon de profondeur unique VkImage à tous vos framebuffers.