@@ -4,9 +4,9 @@ Notre programme peut maintenant charger et afficher des modèles 3D. Dans ce cha
44fonctionnalité : celle de générer et d'utiliser des mipmaps. Elles sont utilisées dans tous les applications 3D. Vulkan
55laisse au programmeur un control quasiment total sur leur génération.
66
7- Les mipmaps sont des versions de qualité réduite précalculées. Chacune de ces versions est deux fois moins haute et
8- large que l'originale. Les objets plus distants de la caméra peuvent utiliser ces versions pour le sampling de la
9- texture. Le rendu est alors plus rapide et plus lisse. Voici un exemple de mipmpas :
7+ Les mipmaps sont des versions de qualité réduite précalculées d'une texture . Chacune de ces versions est deux fois
8+ moins haute et large que l'originale. Les objets plus distants de la caméra peuvent utiliser ces versions pour le
9+ sampling de la texture. Le rendu est alors plus rapide et plus lisse. Voici un exemple de mipmpas :
1010
1111![ ] ( /images/mipmaps_example.jpg )
1212
@@ -52,12 +52,14 @@ void createImage(uint32_t width, uint32_t height, uint32_t mipLevels, VkFormat f
5252 ...
5353}
5454```
55+
5556```c++
5657VkImageView createImageView(VkImage image, VkFormat format, VkImageAspectFlags aspectFlags, uint32_t mipLevels) {
5758 ...
5859 viewInfo.subresourceRange.levelCount = mipLevels;
5960 ...
6061```
62+
6163``` c++
6264void transitionImageLayout (VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t mipLevels) {
6365 ...
@@ -72,13 +74,15 @@ createImage(swapChainExtent.width, swapChainExtent.height, 1, depthFormat, VK_IM
7274...
7375createImage(texWidth, texHeight, mipLevels, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, textureImage, textureImageMemory);
7476```
77+
7578``` c++
7679swapChainImageViews[i] = createImageView(swapChainImages[i], swapChainImageFormat, VK_IMAGE_ASPECT_COLOR_BIT, 1 );
7780...
7881depthImageView = createImageView(depthImage, depthFormat, VK_IMAGE_ASPECT_DEPTH_BIT, 1 );
7982...
8083textureImageView = createImageView(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, mipLevels);
8184```
85+
8286``` c++
8387transitionImageLayout (depthImage, depthFormat, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1);
8488...
@@ -108,7 +112,7 @@ prendraient beaucoup de temps. En fait il est possible de transitionner les nive
108112des autres. Nous pouvons donc mettre l'image initiale à ` VK_IMAGE_LAYOUT_TRANSFER_SCR_OPTIMAL ` et la chaîne de mipmaps
109113à ` VK_IMAGE_LAYOUT_DST_OPTIMAL ` . Nous pourrons réaliser les transitions à la fin de chaque opération.
110114
111- La fonction ` transitionImageLayout ` ne sait réalise une transition d'organisation que sur l'image entière. Nous allons
115+ La fonction ` transitionImageLayout ` ne peut réaliser une transition d'organisation que sur l'image entière. Nous allons
112116donc devoir écrire quelque commandes liées aux barrières de pipeline. Supprimez la transition vers
113117` VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL ` dans ` createTextureImage ` :
114118
@@ -144,8 +148,8 @@ void generateMipmaps(VkImage image, int32_t texWidth, int32_t texHeight, uint32_
144148```
145149
146150Nous allons réaliser plusieurs transitions, et pour cela nous réutiliserons cette structure ` VkImageMemoryBarrier ` . Les
147- champs remplis ci-dessus sont corrects pour toutes les barrières. Ceux qui ne sont pas encore remplis changeront à
148- chaque transition .
151+ champs remplis ci-dessus seront valides pour tous les niveaux, et nous allons changer les champs manquant au fur et à
152+ mesure de la génération des mipmaps .
149153
150154``` c++
151155int32_t mipWidth = texWidth;
@@ -226,7 +230,7 @@ vkCmdPipelineBarrier(commandBuffer,
226230```
227231
228232Ensuite, la boucle transtionne le ` i-1 ` ième niveau de mipmap vers l'organisation optimale pour la lecture par shader.
229- La transition attendra la fin de la commande. Toutes les opérations de sampling attendront aussi .
233+ La transition attendra la fin de la commande, de même que les opérations de sampling.
230234
231235``` c++
232236 ...
@@ -259,12 +263,12 @@ Avant de terminer avec le command buffer, nous devons ajouter une dernière barr
259263niveau de mipmap vers `VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL`. Ce cas n'avait pas été géré par la boucle, car elle
260264n'a jamais servie de source à une copie.
261265
262- Appelez finallement cette fonction depuis `createTextureImage` :
266+ Appelez finalement cette fonction depuis `createTextureImage` :
263267
264268```c++
265269transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, mipLevels);
266270 copyBufferToImage(stagingBuffer, textureImage, static_cast<uint32_t>(texWidth), static_cast<uint32_t>(texHeight));
267- //transitioned to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL while generating mipmaps
271+ //transions vers VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL pendant la génération des mipmaps
268272...
269273generateMipmaps(textureImage, texWidth, texHeight, mipLevels);
270274```
@@ -327,14 +331,14 @@ dans le fichier avec l'image de base. Le chargement de mipmaps prégénérées e
327331
328332Un objet ` VkImage ` contient les données de l'image et un objet ` VkSampler ` contrôle la lecture des données pendant le
329333rendu. Vulkan nous permet de spécifier les valeurs ` minLod ` , ` maxLod ` , ` mipLodBias ` et ` mipmapMode ` , où "Lod" signifie
330- " level of detail" ou " niveau de détail" . Pendant l'échantillonage d'une texture, le sampler sélectionne le niveau de
334+ * level of detail* ( * niveau de détail* ) . Pendant l'échantillonage d'une texture, le sampler sélectionne le niveau de
331335mipmap à utiliser suivant ce pseudo-code :
332336
333337``` c++
334- lod = getLodLevelFromScreenSize(); // plus petit quand l'objet est proche, peut etre negatif
338+ lod = getLodLevelFromScreenSize(); // plus petit quand l'objet est proche, peut être negatif
335339lod = clamp(lod + mipLodBias, minLod, maxLod);
336340
337- level = clamp(floor(lod), 0 , texture.mipLevels - 1 ); // limité au nombre de niveaux de mipmaps dans le texture
341+ level = clamp(floor(lod), 0 , texture.mipLevels - 1 ); // limité par le nombre de niveaux de mipmaps dans le texture
338342
339343if (mipmapMode == VK_SAMPLER_MIPMAP_MODE_NEAREST) {
340344 color = sample(level);
@@ -368,12 +372,13 @@ Pour voir les résultats de ce chapitre, nous devons choisir les valeurs pour `t
368372void createTextureSampler () {
369373 ...
370374 samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
371- samplerInfo.minLod = 0; // Optionnel
375+ samplerInfo.minLod = 0;
372376 samplerInfo.maxLod = static_cast<float>(mipLevels);
373- samplerInfo.mipLodBias = 0; // Optionnel
377+ samplerInfo.mipLodBias = 0; // Optionel
374378 ...
375379}
376380```
381+
377382Pour utiliser la totalité des niveaux de mipmaps, nous mettons ` minLod ` à ` 0 ` et ` maxLod ` au nombre de niveaux de
378383mipmaps. Nous n'avons aucune raison d'altérer ` lod ` avec ` mipLodBias ` , alors nous pouvons le mettre à ` 0 ` .
379384
0 commit comments