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

Skip to content

Commit 4631561

Browse files
author
Alexis Ronez
committed
Rephrased and renamed Generating mipmaps
1 parent ab3b59b commit 4631561

1 file changed

Lines changed: 19 additions & 14 deletions

File tree

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ Notre programme peut maintenant charger et afficher des modèles 3D. Dans ce cha
44
fonctionnalité : celle de générer et d'utiliser des mipmaps. Elles sont utilisées dans tous les applications 3D. Vulkan
55
laisse 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++
5657
VkImageView createImageView(VkImage image, VkFormat format, VkImageAspectFlags aspectFlags, uint32_t mipLevels) {
5758
...
5859
viewInfo.subresourceRange.levelCount = mipLevels;
5960
...
6061
```
62+
6163
```c++
6264
void 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
...
7375
createImage(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++
7679
swapChainImageViews[i] = createImageView(swapChainImages[i], swapChainImageFormat, VK_IMAGE_ASPECT_COLOR_BIT, 1);
7780
...
7881
depthImageView = createImageView(depthImage, depthFormat, VK_IMAGE_ASPECT_DEPTH_BIT, 1);
7982
...
8083
textureImageView = createImageView(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, mipLevels);
8184
```
85+
8286
```c++
8387
transitionImageLayout(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
108112
des 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
112116
donc 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

146150
Nous 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++
151155
int32_t mipWidth = texWidth;
@@ -226,7 +230,7 @@ vkCmdPipelineBarrier(commandBuffer,
226230
```
227231

228232
Ensuite, 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
259263
niveau de mipmap vers `VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL`. Ce cas n'avait pas été géré par la boucle, car elle
260264
n'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++
265269
transitionImageLayout(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
...
269273
generateMipmaps(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

328332
Un objet `VkImage` contient les données de l'image et un objet `VkSampler` contrôle la lecture des données pendant le
329333
rendu. 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
331335
mipmap à 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
335339
lod = 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

339343
if (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
368372
void 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+
377382
Pour utiliser la totalité des niveaux de mipmaps, nous mettons `minLod` à `0` et `maxLod` au nombre de niveaux de
378383
mipmaps. Nous n'avons aucune raison d'altérer `lod` avec `mipLodBias`, alors nous pouvons le mettre à `0`.
379384

0 commit comments

Comments
 (0)