Skip to content

Commit a1537f0

Browse files
smanicongreggman
authored andcommitted
finish article
1 parent 4d2f65c commit a1537f0

File tree

1 file changed

+90
-86
lines changed

1 file changed

+90
-86
lines changed

webgl/lessons/fr/webgl-drawing-multiple-things.md

Lines changed: 90 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ TOC: Dessiner plusieurs choses
66
Cet article est la suite de [WebGL Les bases](webgl-fundamentals.html).
77
Si vous ne les avez pas lu, je vous suggère de commencer par ceux là.
88

9-
L'une des questions les plus courrantes après avoir afficher quelque chose
9+
L'une des questions les plus courantes après avoir affiché quelque chose
1010
avec WebGL, c'est comment en afficher plusieurs.
1111

12-
L'une des premières chose à réaliser est qu'à part quelques exceptions,
12+
L'une des premières choses à réaliser est qu'à part quelques exceptions,
1313
WebGL comme avoir une fonction écrite par une personne qui au lieu de passer tous
1414
les paramètres à celle-ci, vous aviez une simple fonction qui affiche des choses et
1515
plus de 70 autres qui initialisent l'état de la première. Par exemple, imaginez que
@@ -46,16 +46,16 @@ WebGL fonction de la seconde manière. Les fonctions comme `gl.createBuffer`,
4646
les données des buffers (vertex), des textures (couleurs, etc...).
4747
`gl.createProgram`, `gl.createShader`, `gl.compileShader` et
4848
`gl.linkProgram` vous permettent de charger les shaders GLSL. Presque tout le reste
49-
des fonctions WebGL configurent les variables globales or les états qui sont utilisés
49+
des fonctions WebGL configurent les variables globales ou les états qui sont utilisés
5050
quand les fonctions `gl.drawArrays` ou `gl.drawElements` sont appelées.
5151

5252
Sachant cela, un programme WebGL typique aura la structure suivante.
5353

5454
Au moment de l'initialisation
5555

5656
* Créé tous les shaders et les programmes et récupère leur emplacement
57-
* Créé les buffers et charge les données des sommets
58-
* Créé les textures et charge les données des textures
57+
* Créé les buffers et chargent les données des sommets
58+
* Créé les textures et chargent les données des textures
5959

6060
Au moment du rendu
6161

@@ -69,26 +69,26 @@ Au moment du rendu
6969
* Initialiser les _uniforms_ pour les choses que vous souhaitez dessiner
7070
* Appelez `gl.uniformXXX` pour chaque _uniform_
7171
* Appelez `gl.activeTexture` et `gl.bindTexture` pour assigner les textures
72-
aux _texture unit_
72+
aux _textures unit_
7373
* Appelez `gl.drawArrays` ou `gl.drawElements`
7474

7575
C'est aussi simple que ça. C'est à vous d'organiser votre code pour
7676
accomplir cette tâche.
7777

78-
Plusieurs chose comme le chargement des données de texture (et peut être même
79-
les données des sommets) peuvent être initialisé de manière asynchrone, parce que
78+
Plusieurs choses comme le chargement des données de texture (et peut-être même
79+
les données des sommets) peuvent être initialisées de manière asynchrone, parce que
8080
vous avez besoin d'attendre que ce soit téléchargé sur le net.
8181

82-
Let's make a simple app to draw 3 things. A cube, a sphere, and a cone.
82+
Essayons de faire une simple application qui dessine 3 choses : un cube, une sphère
83+
et un cône.
8384

84-
I'm not going to go into the details of how to compute cube, sphere, and
85-
cone data. Let's just assume we have functions to create them and they
86-
return [bufferInfo objects as described in the previous
87-
article](webgl-less-code-more-fun.html).
85+
Je ne vais pas rentrer dans les détails de comment faire un cube, une sphère
86+
ou un cône. Considérons que nous avons des fonctions pour les créer et
87+
retourner [les buffers comme décrits dans le chapitre précédent](webgl-less-code-more-fun.html).
8888

89-
So here's the code. Our shader is the same one simple shader from our
90-
[perspective example](webgl-3d-perspective.html) except we've added a
91-
`u_colorMult` to multiply the vertex colors by.
89+
Voici donc le code. Notre shader est le même shader simple de notre
90+
[exemple de perspective] (webgl-3d-perspective.html) sauf que nous avons ajouté un
91+
`u_colorMult` pour multiplier les sommets par des couleurs.
9292

9393
// Passed in from the vertex shader.
9494
varying vec4 v_color;
@@ -100,7 +100,7 @@ So here's the code. Our shader is the same one simple shader from our
100100
}
101101

102102

103-
At init time
103+
Au moment de l'initialisation
104104

105105
// Our uniforms for each thing we want to draw
106106
var sphereUniforms = {
@@ -121,7 +121,7 @@ At init time
121121
var cubeTranslation = [-40, 0, 0];
122122
var coneTranslation = [ 40, 0, 0];
123123

124-
At draw time
124+
Au moment du dessin
125125

126126
var sphereXRotation = time;
127127
var sphereYRotation = time;
@@ -180,23 +180,24 @@ At draw time
180180

181181
gl.drawArrays(gl.TRIANGLES, 0, coneBufferInfo.numElements);
182182

183-
And here's that
183+
Et voilà !
184184

185185
{{{example url="../webgl-multiple-objects-manual.html" }}}
186186

187-
One thing to notice is since we only have a single shader program we only
188-
called `gl.useProgram` once. If we had different shader programs you'd
189-
need to call `gl.useProgram` before um... using each program.
187+
Une chose à noter est que puisque nous n'avons qu'un seul programme de shader,
188+
nous n'avons pas besoin d'appeler `gl.useProgram` plusieurs fois. Si nous avons
189+
différents programmes de shader, vous aurez besoin d'appeler `gl.useProgram`
190+
avant euh ... l'utilisation de chaque programme.
190191

191-
This is another place where it's a good idea to simplify. There are
192-
effectively 3 main things to combine.
192+
C'est un endroit où c'est une bonne idée de simplifier. Il y a effectivement 3
193+
choses principales à combiner :
193194

194-
1. A shader program (and its uniform and attribute info/setters)
195-
2. The buffer and attributes for the thing you want to draw
196-
3. The uniforms needed to draw that thing with the given shader.
195+
1. Le programme de Shader (les infos/mise à jour des uniform et attributes)
196+
2. Le buffer et les attributes pour les choses que vous souhaitez dessiner
197+
3. Les uniforms nécessaires pour dessiner les choses liées au shader
197198

198-
So, a simple simplification would be to make an array of things to draw
199-
and in that array put the 3 things together
199+
Donc, une simple simplification serait de faire un tableau de choses à dessiner
200+
et dans ce tableau mettre les 3 choses ensemble
200201

201202
var objectsToDraw = [
202203
{
@@ -216,7 +217,7 @@ and in that array put the 3 things together
216217
},
217218
];
218219

219-
At draw time we still need to update the matrices
220+
Au moment de dessiner nous avons encore besoin de mettre à jour les matrices
220221

221222
var sphereXRotation = time;
222223
var sphereYRotation = time;
@@ -244,7 +245,7 @@ At draw time we still need to update the matrices
244245
coneXRotation,
245246
coneYRotation);
246247

247-
But the drawing code is now just a simple loop
248+
Mais maintenant le code permettant de faire le dessin est juste une boucle
248249

249250
// ------ Draw the objects --------
250251

@@ -265,19 +266,19 @@ But the drawing code is now just a simple loop
265266
});
266267

267268

268-
And this is arguably the main rendering loop of most 3D engines in
269-
existence. Somewhere some code or codes decide what goes into the list of
270-
`objectsToDraw` but that's basically it.
269+
Et c'est sans doute la principale boucle de rendu dans la plupart de moteurs 3d
270+
qui existent. Parfois, un ou plusieurs codes decident de ce qui rentre dans la liste
271+
de `objectsToDraw`, mais c'est basiquement ça.
271272

272273
{{{example url="../webgl-multiple-objects-list.html" }}}
273274

274-
There are a few basic optimizations. If the program we're about to draw
275-
with is the same as the previous program we drew with then there's no need
276-
to call `gl.useProgram`. Similarly if we're drawing with the same
277-
shape/geometry/vertices we previously drew with there's no need to set
278-
those up again.
275+
Il existe quelques optimisations de base. Si le programme que nous sommes
276+
sur le point de dessiner est le même que le programme précédent alors il
277+
n'y a pas besoin d'appeler `gl.useProgram`. De même, si nous dessinons les
278+
mêmes shape/geometry/vertices que précédent, nous n'avons pas besoin de les
279+
initialiser une nouvelle fois.
279280

280-
So, a very simple optimization might look like this
281+
Ainsi, une optimisation très simple pourrait ressembler à ceci
281282

282283
var lastUsedProgramInfo = null;
283284
var lastUsedBufferInfo = null;
@@ -311,8 +312,8 @@ So, a very simple optimization might look like this
311312
gl.drawArrays(gl.TRIANGLES, 0, bufferInfo.numElements);
312313
});
313314

314-
This time let's draw a lot more objects. Instead of just 3 like before let's make
315-
the list of things to draw larger
315+
C'est le moment de dessiner plus d'objet. Au lieu d'en dessiner 3 comme nous l'avons
316+
fait jusque-là, nous allons faire une liste qui en contient plus.
316317

317318
// put the shapes in an array so it's easy to pick them at random
318319
var shapes = [
@@ -351,7 +352,7 @@ the list of things to draw larger
351352
});
352353
}
353354

354-
At render time
355+
Au moment du rendu
355356

356357
// Compute the matrices for each object.
357358
objects.forEach(function(object) {
@@ -363,53 +364,56 @@ At render time
363364
object.yRotationSpeed * time);
364365
});
365366

366-
Then draw the objects using the loop above.
367+
Le rendu des objets utilisant la boucle ci-dessus
367368

368369
{{{example url="../webgl-multiple-objects-list-optimized.html" }}}
369370

370-
You could also sort the list by `programInfo` and/or `bufferInfo` so that
371-
the optimization kicks in more often. Most game engines do this.
372-
Unfortunately it's not that simple. If everything you're drawing is
373-
opaque and then you can just sort. But, as soon you need to draw
374-
semi-transparent things you'll need to draw them in a specific order.
375-
Most 3D engines handle this by having 2 or more lists of objects to draw.
376-
One list for opaque things. Another list for transparent things. The
377-
opaque list is sorted by program and geometry. The transparent list is
378-
sorted by depth. There might also be separate lists for other things like
379-
overlays or post processing effects.
371+
Vous pouvez aussi trier la liste par `programInfo` et/ou `bufferInfo`
372+
de sorte que l'optimisation démarre plus souvent. La plupart des moteurs
373+
de jeux le font. Malheureusement ce n'est pas si simple. Si tout ce que
374+
vous dessinez est opaque, alors vous pouvez garder le tri tel qu'il est.
375+
Mais à un moment, vous aurez besoin de dessiner des objets semi-transparents,
376+
et il faudra les dessiner dans un ordre specifique. La plupart des moteurs
377+
3d resolvent ça en ayant 2 listes ou plus d'objet à dessiner : Une liste pour
378+
les objets opaques et une autre contenant des objets transparents. La liste des
379+
objets opaques est triée par programme et par géométrie. La liste des objets
380+
transparents est triée par profondeur. Il pourrait également y avoir des listes
381+
distinctes pour d'autres choses comme superpositions ou effets de post-traitement.
380382

381383
<a href="../webgl-multiple-objects-list-optimized-sorted.html"
382-
target="_blank">Here's a sorted example</a>. On my machine I get ~31fps
383-
unsorted and ~37 sorted. That's nearly a 20% increase. But, it's worst
384-
case vs best case and most programs would be doing a lot more so it's
385-
arguably not worth thinking about for all but the most special cases.
386-
387-
It's important to notice that you can't draw just any geometry with just
388-
any shader. For example a shader that requires normals will not function
389-
with geometry that has no normals. Similarly a shader that requires
390-
textures will not work without textures.
391-
392-
This is one of the many reasons it's great to choose a 3D Library like
393-
[Three.js](https://threejs.org) because it handles all of this for you.
394-
You create some geometry, you tell three.js how you want it rendered and
395-
it generates shaders at runtime to handle the things you need. Pretty
396-
much all 3D engines do this from Unity3D to Unreal to Source to Crytek.
397-
Some generate them offline but the important thing to realize is they
398-
*generate* shaders.
399-
400-
Of course the reason you're reading these articles is you want to know
401-
what's going on deep down. That's great and it's fun to write everything
402-
yourself. It's just important to be aware [WebGL is super low
403-
level](webgl-2d-vs-3d-library.html) so there's a ton of work for you to do
404-
if you want to do it yourself and that often includes writing a shader
405-
generator since different features often require different shaders.
406-
407-
You'll notice I didn't put `computeMatrix` inside the loop. That's
408-
because rendering should arguably be separated from computing matrices.
409-
It's common to compute matrices from a [scene graph and we'll go over that
410-
in another article](webgl-scene-graph.html).
411-
412-
Now that we have a framework for drawing multiple objects [lets draw some
413-
text](webgl-text-html.html).
384+
target="_blank">Un exemple de tri</a>. Sur ma machine, j'ai 31 fps quand
385+
ce n'est pas trié, et 37 fps après le tri. C'est une hausse de performance
386+
d'environ 20%. Mais dans le pire cas ou le meilleur cas, la plupart des programmes
387+
en feraient beaucoup plus, donc ce n'est sans doute pas la peine d'y penser pour tous
388+
sauf les cas les plus particuliers.
389+
390+
Il est important de noter que vous ne pouvez pas dessiner n'importe quelle
391+
géométrie avec n'importe quel programme de shader. Par exemple un programme
392+
de shader qui requit des normales, ne fonctionnera pas avec une géométrie
393+
sans shader. Pareillement, un programme de shader qui requit des textures,
394+
ne fonctionnera pas avec une géométrie sans texture.
395+
396+
C'est l'une des raisons pour laquelle il est plus simple de choisir une
397+
librairie 3D comme [Three.js](https://threejs.org), car il gère ces
398+
subtilités pour vous. Quand vous créez une géométrie, vous informez three.js
399+
de comment votre forme doit être rendue, et il génère le programme de shader
400+
au runtime. À peu près tous les moteurs 3D le font, de Unity3D à Unreal, ou
401+
encore Source, ou Crytek. Certains les ont déjà pré-génèré, mais le plus
402+
important à savoir, c'est que les programmes de shader sont *générés*.
403+
404+
Bien entendu, la raison que vous avez de lire ces articles est de vouloir
405+
savoir ce qui se passe à un plus bas niveau. C'est bien et passionnant de
406+
tout écrire soit-même. Mais il faut être conscient que [WebGL est très bas
407+
niveau](webgl-2d-vs-3d-library.html). Il faudra donc tout faire soit-même,
408+
ce qui inclut d'écrire le générateur de shader si les ressources nécessitent
409+
différentes fonctionnalités.
410+
411+
Vous avez peut-être noté que nous n'avons pas mis `computeMatrix` dans la
412+
boucle. C'est parce que le processus de rendu doit être séparé de celui des
413+
matrices. Il est commun de calculer les matrices à partir d'un [graphe de scène
414+
que nous étudierons dans un prochain article](webgl-scene-graph.html).
415+
416+
Maintenant que nous avons un framework pour dessiner plusieurs objets, [essayons de
417+
dessiner du texte](webgl-text-html.html).
414418

415419

0 commit comments

Comments
 (0)