11## Introduction
22
3- Jusqu'à présent nous avons projeté notre géométrieen 3D, mais elle n'est toujours définie qu'en 2D. Nous allons ajouter
3+ Jusqu'à présent nous avons projeté notre géométrie en 3D, mais elle n'est toujours définie qu'en 2D. Nous allons ajouter
44l'axe Z dans ce chapitre pour permettre l'utilisation de modèles 3D. Nous placerons un carré au-dessus ce celui que nous
5- avons déjà, et nous verrons ce qui se passe si la géométrie n'est pas filtrée par profondeur.
5+ avons déjà, et nous verrons ce qui se passe si la géométrie n'est pas organisée par profondeur.
66
77## Géométrie en 3D
88
@@ -56,7 +56,7 @@ const std::vector<Vertex> vertices = {
5656```
5757
5858Si vous lancez l'application vous verrez exactement le même résultat. Il est maintenant temps d'ajouter de la géométrie
59- pour rendre la scène plus interressante , et pour montrer le problème évoqué plus haut. Dupliquez les vertices afin qu'un
59+ pour rendre la scène plus intéressante , et pour montrer le problème évoqué plus haut. Dupliquez les vertices afin qu'un
6060second carré soit rendu au-dessus de celui que nous avons maintenant :
6161
6262![ ] ( /images/extra_square.svg )
@@ -111,9 +111,9 @@ configurer GLM avec `GLM_FORCE_DEPTH_ZERO_TO_ONE` pour qu'elle utilise des valeu
111111
112112## Image de pronfondeur et views sur cette image
113113
114- L'attachement de profondeur est une image. La différence est que celui -ci n'est pas créé par la swap chain. Nous n'avons
115- besoin que d'un seul attachement de profondeur, car les opérations sont séquentielles. L'attachement aura encore besoin
116- des trois ressources : une image, de la mémoire et une image view.
114+ L'attachement de profondeur est une image. La différence est que celle -ci n'est pas créée par la swap chain. Nous
115+ n'avons besoin que d'un seul attachement de profondeur, car les opérations sont séquentielles. L'attachement aura
116+ encore besoin des trois mêmes ressources : une image, de la mémoire et une image view.
117117
118118``` c++
119119VkImage depthImage;
@@ -142,7 +142,7 @@ void createDepthResources() {
142142La création d'une image de profondeur est assez simple. Elle doit avoir la même résolution que l'attachement de couleur,
143143définie par l'étendue de la swap chain. Elle doit aussi être configurée comme image de profondeur, avoir un tiling
144144optimal et une mémoire placée sur la carte graphique. Une question persiste : quelle est l'organisation optimale pour
145- une image de profondeur? Le format contient un composant de profondeur, indiqué par ` _D??_ ` dans les valeurs de type
145+ une image de profondeur? Le format contient un composant de profondeur, indiqué par ` _Dxx_ ` dans les valeurs de type
146146` VK_FORMAT ` .
147147
148148Au contraire de l'image de texture, nous n'avons pas besoin de déterminer le format requis car nous n'accéderons pas à
@@ -157,7 +157,7 @@ Le composant de stencil est utilisé pour le [test de stencil](https://en.wikipe
157157test additionnel qui peut être combiné avec le test de profondeur. Nous y reviendrons dans un futur chapitre.
158158
159159Nous pourrions nous contenter d'utiliser ` VK_FORMAT_D32_SFLOAT ` car son support est pratiquement assuré, mais il est
160- préférable d'utiliser une fonction pour déterminer le meilleur format localement supporté. Créez ainsi la fonction
160+ préférable d'utiliser une fonction pour déterminer le meilleur format localement supporté. Créez pour cela la fonction
161161` findSupportedFormat ` . Elle vérifiera que les formats en argument sont supportés et choisira le meilleur en se basant
162162sur leur ordre dans le vecteurs des formats acceptables fourni en argument :
163163
@@ -209,11 +209,11 @@ VkFormat findSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTil
209209 }
210210 }
211211
212- throw std::runtime_error("aucun format n'est supporté!");
212+ throw std::runtime_error("aucun des formats demandés n'est supporté!");
213213}
214214```
215215
216- Nous allons utiliser cette fonction pour créer une autre fonction `findDepthFormat`. Elle sélectionnera un format
216+ Nous allons utiliser cette fonction depuis une autre fonction `findDepthFormat`. Elle sélectionnera un format
217217avec un composant de profondeur qui supporte d'être un attachement de profondeur :
218218
219219```c++
@@ -272,15 +272,16 @@ textureImageView = createImageView(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IM
272272```
273273
274274Voilà tout pour la création de l'image de profondeur. Nous n'avons pas besoin d'y envoyer de données ou quoi que ce soit
275- de ce genre, ce qui est très pratique. Il faudra quand même faire changer son organisation, pour qu'il puisse être
276- utilisé comme attachement. Nous pourrions faire cette transition dans la render pass comme pour l'attachement de
277- couleur, mais j'ai préféré utiliser une barrière de pipeline pour ne faire cette transition qu'une seule fois.
275+ de ce genre, ce qui est nous simplfie le travail. Il faudra quand même faire changer son organisation, pour qu'elle
276+ puisse être utilisé comme attachement. Nous pourrions faire cette transition dans la render pass comme pour
277+ l'attachement de couleur, mais j'ai préféré utiliser une barrière de pipeline pour ne faire cette transition qu'une
278+ seule fois.
278279
279280``` c++
280281transitionImageLayout (depthImage, depthFormat, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
281282```
282283
283- L'organisation indéfinie peut être utilisée comme organisation par défaut , dans la mesure où aucun contenu initial n'a
284+ L'organisation indéfinie peut être utilisée comme organisation intiale , dans la mesure où aucun contenu d'origine n'a
284285d'importance. Nous devons devons faire évaluer la logique de `transitionImageLayout` pour qu'elle puisse utiliser la
285286bonne subresource.
286287
@@ -321,12 +322,12 @@ if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && newLayout == VK_IMAGE_LAYOUT_TRANS
321322 sourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
322323 destinationStage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
323324} else {
324- throw std::invalid_argument("unsupported layout transition !");
325+ throw std::invalid_argument("transition d'organisation non supportée !");
325326}
326327```
327328
328329Le buffer de profondeur sera lu avant d'écrire un fragment, et écrit après qu'un fragment valide soit traité. La lecture
329- se passe en ` VK_PIPELINE_STAGE_EARL_FRAGMENT_TESTS_BIT ` et l'écriture en ` VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT ` .
330+ se passe en ` VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT ` et l'écriture en ` VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT ` .
330331Vous devriez choisir la première des étapes correspondant à l'opération correspondante, afin que tout soit prêt pour
331332l'utilisation de l'attachement de profondeur.
332333
@@ -348,9 +349,9 @@ depthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
348349```
349350
350351La ` format ` doit être celui de l'image de profondeur. Pour cette fois nous ne garderons pas les données de profondeur,
351- car nous n'en avons pas encore besoin après le rendu. Encore une fois le hardware pourra réaliser des optimisations. Et
352- de même nous n'avons pas besoin des valeurs du rendu précédent pour le rendu actuel , nous pouvons donc mettre
353- ` VK_IMAGE_LAYOUT_UNDEFINED ` comme valeur pour ` initialLayout ` .
352+ car nous n'en avons plus besoin après le rendu. Encore une fois le hardware pourra réaliser des optimisations. Et
353+ de même nous n'avons pas besoin des valeurs du rendu précédent pour le début du rendu de la frame , nous pouvons donc
354+ mettre ` VK_IMAGE_LAYOUT_UNDEFINED ` comme valeur pour ` initialLayout ` .
354355
355356``` c++
356357VkAttachmentReference depthAttachmentRef = {};
@@ -369,7 +370,7 @@ subpass.pDepthStencilAttachment = &depthAttachmentRef;
369370```
370371
371372Les subpasses ne peuvent utiliser qu'un seul attachement de profondeur (et de stencil). Réaliser le test de profondeur
372- sur plusieurs buffers n'a pas beaucoup de sens.
373+ sur plusieurs buffers n'a de toute façon pas beaucoup de sens.
373374
374375``` c++
375376std::array<VkAttachmentDescription, 2 > attachments = {colorAttachment, depthAttachment};
@@ -407,8 +408,8 @@ framebufferInfo.layers = 1;
407408```
408409
409410L'attachement de couleur doit différer pour chaque image de la swap chain, mais l'attachement de profondeur peut être le
410- même pour toutes, car il n'est utilisé que par la subpasse, et seule une instance de cette subpasse n'est autorisée à
411- tourner .
411+ même pour toutes, car il n'est utilisé que par la subpasse, et la synchronisation que nous avons mise en place ne permet
412+ pas l'exécution de plusieurs subpasses en même temps .
412413
413414Nous devons également déplacer l'appel à ` createFramebuffers ` pour que la fonction ne soit appelée qu'après la création
414415de l'image de profondeur :
@@ -465,8 +466,8 @@ Nous gardons le `<` car il correspond le mieux à la convention employée par Vu
465466
466467``` c++
467468depthStencil.depthBoundsTestEnable = VK_FALSE;
468- depthStencil.minDepthBounds = 0 .0f ; // Optionnel
469- depthStencil.maxDepthBounds = 1 .0f ; // Optionnel
469+ depthStencil.minDepthBounds = 0 .0f ; // Optionel
470+ depthStencil.maxDepthBounds = 1 .0f ; // Optionel
470471```
471472
472473Les champs ` depthBoundsTestEnable ` , ` minDepthBounds ` et ` maxDepthBounds ` sont utilisés pour des tests optionnels
@@ -475,11 +476,11 @@ valeurs fournies ici. Nous n'utiliserons pas cette fonctionnalité.
475476
476477``` c++
477478depthStencil.stencilTestEnable = VK_FALSE;
478- depthStencil.front = {}; // Optionnel
479- depthStencil.back = {}; // Optionnel
479+ depthStencil.front = {}; // Optionel
480+ depthStencil.back = {}; // Optionel
480481```
481482
482- Les trois derniers champs configurent les opérations du buffer stencil, que nous n'utiliserons pas non plus dans ce
483+ Les trois derniers champs configurent les opérations du buffer de stencil, que nous n'utiliserons pas non plus dans ce
483484tutoriel. Si vous voulez l'utiliser, vous devrez vous assurer que le format sélectionné pour la profondeur contient
484485aussi un composant pour le stencil.
485486
@@ -488,7 +489,8 @@ pipelineInfo.pDepthStencilState = &depthStencil;
488489```
489490
490491Mettez à jour la création d'une instance de ` VkGraphicsPipelineCreateInfo ` pour référencer l'état de profondeur et de
491- pochoir que nous venons de créer. Un tel état doit être spécifié si la passe contient une de ces fonctionnalités.
492+ stencil que nous venons de créer. Un tel état doit être spécifié si la passe contient au moins l'une de ces
493+ fonctionnalités.
492494
493495Si vous lancez le programme, vous verrez que la géométrie est maintenant correctement rendue :
494496
@@ -527,8 +529,8 @@ void cleanupSwapChain() {
527529}
528530```
529531
530- Votre application est maintenant capable de rendre correctement de la géométrie 3D! Nous allons appliquer cette
531- capacité pour afficher un modèle dans le prohain chapitre.
532+ Votre application est maintenant capable de rendre correctement de la géométrie 3D! Nous allons utliser cette
533+ fonctionnalité pour afficher un modèle dans le prohain chapitre.
532534
533535[ Code C++] ( /code/26_depth_buffering.cpp ) /
534536[ Vertex shader] ( /code/26_shader_depth.vert ) /
0 commit comments