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

Skip to content

Commit 8bf834e

Browse files
author
Alexis Ronez
committed
Rephrased and renamed Vertex buffer -> Vertex input description
1 parent 7cd46f7 commit 8bf834e

1 file changed

Lines changed: 38 additions & 34 deletions

File tree

fr/04_Vertex_buffers/00_Description_des_entrés_vertex.md renamed to fr/04_Vertex_buffers/00_Description_des_entrées_des_sommets.md

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
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
55
buffer 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 à
3334
l'origine de l'invocation du shader. Ces données peuvent être de différentes natures, des couleurs aux coordonnées en
3435
passant par des coordonnées de texture. Recompilez ensuite le vertex shader.
3536

@@ -46,10 +47,10 @@ layout(location = 2) in vec3 inColor;
4647
Vous 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
5354
couleur.
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
8485
stockées dans le GPU. Nous verrons plus tard comment les y stocker. Il y a deux types de structures que nous allons
8586
devoir utiliser.
8687

8788
Pour 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++
9192
struct Vertex {
@@ -101,7 +102,8 @@ struct Vertex {
101102
```
102103

103104
Un *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++
107109
VkVertexInputBindingDescription bindingDescription = {};
@@ -116,10 +118,10 @@ séparant les débuts de deux ensembles de données, c'est à dire l'écart entr
116118
invocation de vertex shader et celles devant être fournies à la suivante. Enfin `inputRate` peut prendre les valeurs
117119
suivantes :
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

141143
Comme 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++
146149
attributeDescriptions[0].binding = 0;
@@ -149,10 +152,10 @@ attributeDescriptions[0].format = VK_FORMAT_R32G32_SFLOAT;
149152
attributeDescriptions[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

157160
Le paramètre `format` permet donc de décrire le type de donnée de l'attribut. Étonnement les formats doivent être
158161
indiqué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
165168
Comme vous pouvez vous en douter il faudra utiliser le format dont le nombre de composants de couleurs correspond au
166169
nombre de données à transmettre. Il est autorisé d'utiliser plus de données que ce qui est prévu dans le shader, et ces
167170
donné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
171174
le shader. Voici quelques exemples :
172175

@@ -175,9 +178,13 @@ le shader. Voici quelques exemples :
175178
bits
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++
183190
attributeDescriptions[1].binding = 0;
@@ -186,13 +193,10 @@ attributeDescriptions[1].format = VK_FORMAT_R32G32B32_SFLOAT;
186193
attributeDescriptions[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
196200
structures de description que nous venons de créer :
197201

198202
```c++
@@ -206,7 +210,7 @@ vertexInputInfo.pVertexAttributeDescriptions = attributeDescriptions.data();
206210
```
207211

208212
La 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
210214
en 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

Comments
 (0)