Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 85ee1da

Browse files
author
Alexis Ronez
committed
Rephrased and renamed Depth buffer
1 parent 96ff6c5 commit 85ee1da

1 file changed

Lines changed: 32 additions & 30 deletions

File tree

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
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
44
l'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

5858
Si 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
6060
second 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++
119119
VkImage depthImage;
@@ -142,7 +142,7 @@ void createDepthResources() {
142142
La création d'une image de profondeur est assez simple. Elle doit avoir la même résolution que l'attachement de couleur,
143143
définie par l'étendue de la swap chain. Elle doit aussi être configurée comme image de profondeur, avoir un tiling
144144
optimal 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

148148
Au 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
157157
test additionnel qui peut être combiné avec le test de profondeur. Nous y reviendrons dans un futur chapitre.
158158

159159
Nous 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
162162
sur 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
217217
avec 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

274274
Voilà 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++
280281
transitionImageLayout(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
284285
d'importance. Nous devons devons faire évaluer la logique de `transitionImageLayout` pour qu'elle puisse utiliser la
285286
bonne 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

328329
Le 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`.
330331
Vous devriez choisir la première des étapes correspondant à l'opération correspondante, afin que tout soit prêt pour
331332
l'utilisation de l'attachement de profondeur.
332333

@@ -348,9 +349,9 @@ depthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
348349
```
349350

350351
La `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++
356357
VkAttachmentReference depthAttachmentRef = {};
@@ -369,7 +370,7 @@ subpass.pDepthStencilAttachment = &depthAttachmentRef;
369370
```
370371

371372
Les 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++
375376
std::array<VkAttachmentDescription, 2> attachments = {colorAttachment, depthAttachment};
@@ -407,8 +408,8 @@ framebufferInfo.layers = 1;
407408
```
408409

409410
L'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

413414
Nous devons également déplacer l'appel à `createFramebuffers` pour que la fonction ne soit appelée qu'après la création
414415
de 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++
467468
depthStencil.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

472473
Les 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++
477478
depthStencil.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
483484
tutoriel. Si vous voulez l'utiliser, vous devrez vous assurer que le format sélectionné pour la profondeur contient
484485
aussi un composant pour le stencil.
485486

@@ -488,7 +489,8 @@ pipelineInfo.pDepthStencilState = &depthStencil;
488489
```
489490

490491
Mettez à 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

493495
Si 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

Comments
 (0)