11## Introduction
22
3- Dans les quatres prochains chapitres nous allons remplacer les vertices inscrites dans le vertex shader par un vertex
4- buffer stocké dans la mémoire de la carte graphique. Nous commencerons par une manière simple de procéder en créeant un
3+ Dans les quatres prochains chapitres nous allons remplacer les sommets inscrits dans le vertex shader par un vertex
4+ buffer stocké dans la mémoire de la carte graphique. Nous commencerons par une manière simple de procéder en créant un
55buffer manipulable depuis le CPU et en y copiant des données avec ` memcpy ` . Puis nous verrons comment avantageusement
6- utiliser un _ staging buffer _ pour accéder à de la mémoire de haute performance.
6+ utiliser un * staging buffer * pour accéder à de la mémoire de haute performance.
77
88## Vertex shader
99
10- Premièrement, changeons le vertex shader pour ne plus avoir les données dans son code. Ce shader prendra en entrée des
11- données utilisées par des variables. Nous indiquons cela en les annotant du mot-clé ` in ` .
10+ Premièrement, changeons le vertex shader en retirant les coordonnées des sommets de son code. Elles seront maintenant
11+ stockés dans une variable. Elle sera liée au contenu du vertex buffer, ce qui est indiqué par le mot-clef ` in ` . Faisons
12+ de même avec la couleur.
1213
1314``` glsl
1415#version 450
@@ -29,7 +30,7 @@ void main() {
2930}
3031```
3132
32- Les variables ` inPosition ` et ` inColor ` sont des _ vertex attributes _ . Ce sont des propriétés spécifiques du vertex à
33+ Les variables ` inPosition ` et ` inColor ` sont des * vertex attributes * . Ce sont des propriétés spécifiques du sommet à
3334l'origine de l'invocation du shader. Ces données peuvent être de différentes natures, des couleurs aux coordonnées en
3435passant par des coordonnées de texture. Recompilez ensuite le vertex shader.
3536
@@ -46,10 +47,10 @@ layout(location = 2) in vec3 inColor;
4647Vous pouvez trouver plus d'information sur les qualificateurs d'organisation sur
4748[ le wiki] ( https://www.khronos.org/opengl/wiki/Layout_Qualifier_(GLSL) ) .
4849
49- ## Vertices
50+ ## Sommets
5051
51- Nous déplaçons les données des vertices depuis le code du shader jusqu'au code C++. Commencez par inclure la librairie
52- GLM, afin d'utiliser deds vecteurs et des matrices. Nous allons utiliser ces types pour les vecteurs de position et de
52+ Nous déplaçons les données des sommets depuis le code du shader jusqu'au code C++. Commencez par inclure la librairie
53+ GLM, afin d'utiliser des vecteurs et des matrices. Nous allons utiliser ces types pour les vecteurs de position et de
5354couleur.
5455
5556``` c++
@@ -75,17 +76,17 @@ const std::vector<Vertex> vertices = {
7576};
7677```
7778
78- Nous utilisons ensuite un tableau de structures pour représenter un ensemble de vertices . Nous utilisons les mêmes
79- couleurs et les mêmes positions qu'avant, mais elles sont maintenant combinées en un seul tableau d'objets.
79+ Nous utiliserons ensuite un tableau de structures pour représenter un ensemble de sommets . Nous utiliserons les mêmes
80+ couleurs et les mêmes positions qu'avant, mais elles seront combinées en un seul tableau d'objets.
8081
8182## Lier les descriptions
8283
83- La prochaine étape consiste à informer Vulkan de la manière de passer ces données au shader une fois qu'elles sont
84+ La prochaine étape consiste à indiquer à Vulkan comment passer ces données au shader une fois qu'elles sont
8485stockées dans le GPU. Nous verrons plus tard comment les y stocker. Il y a deux types de structures que nous allons
8586devoir utiliser.
8687
8788Pour la première, appelée ` VkVertexInputBindingDescription ` , nous allons ajouter une fonction à ` Vertex ` qui renverra
88- une instance de cette structure.
89+ une instance de cette structure.
8990
9091``` c++
9192struct Vertex {
@@ -101,7 +102,8 @@ struct Vertex {
101102```
102103
103104Un * vertex binding* décrit la lecture des données stockées en mémoire. Elle fournit le nombre d'octets entre les jeux de
104- données et la manière de passer d'un ensemble de données (par exemple une coordonnée) au suivant.
105+ données et la manière de passer d'un ensemble de données (par exemple une coordonnée) au suivant. Elle permet à Vulkan
106+ de savoir comment extraire chaque jeu de données correspondant à une invocation du vertex shader du vertex buffer.
105107
106108``` c++
107109VkVertexInputBindingDescription bindingDescription = {};
@@ -116,10 +118,10 @@ séparant les débuts de deux ensembles de données, c'est à dire l'écart entr
116118invocation de vertex shader et celles devant être fournies à la suivante. Enfin ` inputRate ` peut prendre les valeurs
117119suivantes :
118120
119- * ` VK_VERTEX_INPUT_RATE_VERTEX ` : Passer au jeu de données suivante après chaque vertex
121+ * ` VK_VERTEX_INPUT_RATE_VERTEX ` : Passer au jeu de données suivante après chaque sommet
120122* ` VK_VERTEX_INPUT_RATE_INSTANCE ` : Passer au jeu de données suivantes après chaque instance
121123
122- Nous n'utilisons pas d'_ instanced rendering _ donc nous utiliserons la première valeur disponible .
124+ Nous n'utilisons pas d'* instanced rendering * donc nous utiliserons ` VK_VERTEX_INPUT_RATE_VERTEX ` .
123125
124126## Description des attributs
125127
@@ -139,8 +141,9 @@ static std::array<VkVertexInputAttributeDescription, 2> getAttributeDescriptions
139141```
140142
141143Comme le prototype le laisse entendre, nous allons avoir besoin de deux de ces structures. Elles décrivent chacunes
142- l'extraction d'un paquet de données provenant d'un vertex binding. Nous avons deux attributs, la couleur et la position,
143- c'est pourquoi nous avons besoin de deux structures.
144+ l'origine et la nature des données stockées dans une variable shader annotée du ` location=x ` , et la manière d'en
145+ déterminer les valeurs depuis les données extraites par le binding. Comme nous avons deux de
146+ ces variables, nous avons besoin de deux de ces structures. Voici ce qu'il faut remplir pour la position.
144147
145148``` c++
146149attributeDescriptions[0 ].binding = 0 ;
@@ -149,10 +152,10 @@ attributeDescriptions[0].format = VK_FORMAT_R32G32_SFLOAT;
149152attributeDescriptions[0 ].offset = offsetof(Vertex, pos);
150153```
151154
152- Le paramètre ` binding ` informe Vulkan de la provenance des données vertex par vertex, en lui fournissant le vertex
153- binding qui les a extraites. Le paramètre ` location ` correspond à la valeur donnée à la directive ` location ` dans le
154- code du vertex shader. Dans notre cas l'entrée ` 0 ` correspond à la position du vertex stockée dans un vertex de floats
155- de 32 bits.
155+ Le paramètre ` binding ` informe Vulkan de la provenance des données du sommet qui mené à l'invocation du vertex shader,
156+ en lui fournissant le vertex binding qui les a extraites. Le paramètre ` location ` correspond à la valeur donnée à la
157+ directive ` location ` dans le code du vertex shader. Dans notre cas l'entrée ` 0 ` correspond à la position du sommet
158+ stockée dans un vecteur de floats de 32 bits.
156159
157160Le paramètre ` format ` permet donc de décrire le type de donnée de l'attribut. Étonnement les formats doivent être
158161indiqués avec des valeurs énumérées dont les noms semblent correspondre à des gradients de couleur :
@@ -165,8 +168,8 @@ indiqués avec des valeurs énumérées dont les noms semblent correspondre à d
165168Comme vous pouvez vous en douter il faudra utiliser le format dont le nombre de composants de couleurs correspond au
166169nombre de données à transmettre. Il est autorisé d'utiliser plus de données que ce qui est prévu dans le shader, et ces
167170données surnuméraires seront silencieusement ignorées. Si par contre il n'y a pas assez de valeurs les valeurs suivantes
168- seront utilisées par défaut pour les valeurs manquantes : 0, 0 et 1 pour les deuxièmes, troisièmes et quatrièmes
169- composantes. Il n'y a pas de valeur par défaut pour le premier membre car ce cas n'est pas possible . Les types
171+ seront utilisées par défaut pour les valeurs manquantes : 0, 0 et 1 pour les deuxième, troisième et quatrième
172+ composantes. Il n'y a pas de valeur par défaut pour le premier membre car ce cas n'est pas autorisé . Les types
170173(`SFLOAT`, `UINT` et `SINT`) et le nombre de bits doivent par contre correspondre parfaitement à ce qui est indiqué dans
171174le shader. Voici quelques exemples :
172175
@@ -175,9 +178,13 @@ le shader. Voici quelques exemples :
175178bits
176179* `double ` correspond à `VK_FORMAT_R64_SFLOAT` et est un float à précision double (donc de 64 bits)
177180
178- Le paramètre ` format ` définit implicitement la taille en octets des données tandis que le paramètre ` offset ` définit le
179- nombre d'octets à lire depuis le début des données vertex par vertex. Notre binding charge le contenu d'un ` Vertex `
180- à la fois, et l'` offset ` sera calculé par la macro ` offsetof ` .
181+ Le paramètre ` format ` définit implicitement la taille en octets des données. Mais le binding extrait dans notre cas deux
182+ données pour chaque sommet : la position et la couleur. Pour savoir quels octets doivent être mis dans la variable à
183+ laquelle la structure correspond, le paramètre ` offset ` permet d'indiquer de combien d'octets il faut se décaler dans
184+ les données extraites pour se trouver au début de la variable. Ce décalage est calculé automatiquement par la macro
185+ ` offsetof ` .
186+
187+ L'attribut de couleur est décrit de la même façon. Essayez de le remplir avant de regarder la solution ci-dessous.
181188
182189``` c++
183190attributeDescriptions[1 ].binding = 0 ;
@@ -186,13 +193,10 @@ attributeDescriptions[1].format = VK_FORMAT_R32G32B32_SFLOAT;
186193attributeDescriptions[1 ].offset = offsetof(Vertex, color);
187194```
188195
189- L'attribut de couleur est décrit de la même façon. Essayez de le remplir avant de regarder la solution dans le code
190- fourni.
191-
192- ## Entrée des vertices dans la pipeline
196+ ## Entrée des sommets dans la pipeline
193197
194- Nous devons maintenant mettre en place la réception par la pipeline graphique des données de vertices . Nous allons
195- modifier une structures dans ` createGraphicsPipeline ` . Trouvez ` vertexInputInfo ` et ajoutez-y les références aux deux
198+ Nous devons maintenant mettre en place la réception par la pipeline graphique des données des sommets . Nous allons
199+ modifier une structure dans ` createGraphicsPipeline ` . Trouvez ` vertexInputInfo ` et ajoutez-y les références aux deux
196200structures de description que nous venons de créer :
197201
198202``` c++
@@ -206,7 +210,7 @@ vertexInputInfo.pVertexAttributeDescriptions = attributeDescriptions.data();
206210```
207211
208212La pipeline peut maintenant accepter les données des vertices dans le format que nous utilisons et les fournir au vertex
209- shader. Si vous lancez le programme vous verrez que les validation layers rapportent qu'aucun vertex buffer n'est mis
213+ shader. Si vous lancez le programme vous verrez que les validation layers rapportent qu'aucun vertex buffer n'est mis
210214en place. Nous allons donc créer un vertex buffer et y placer les données pour que le GPU puisse les utiliser.
211215
212216[ Code C++] ( /code/17_vertex_input.cpp ) /
0 commit comments