@@ -6,10 +6,10 @@ TOC: Dessiner plusieurs choses
6
6
Cet article est la suite de [ WebGL Les bases] ( webgl-fundamentals.html ) .
7
7
Si vous ne les avez pas lu, je vous suggère de commencer par ceux là.
8
8
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
10
10
avec WebGL, c'est comment en afficher plusieurs.
11
11
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,
13
13
WebGL comme avoir une fonction écrite par une personne qui au lieu de passer tous
14
14
les paramètres à celle-ci, vous aviez une simple fonction qui affiche des choses et
15
15
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`,
46
46
les données des buffers (vertex), des textures (couleurs, etc...).
47
47
` gl.createProgram ` , ` gl.createShader ` , ` gl.compileShader ` et
48
48
` 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
50
50
quand les fonctions ` gl.drawArrays ` ou ` gl.drawElements ` sont appelées.
51
51
52
52
Sachant cela, un programme WebGL typique aura la structure suivante.
53
53
54
54
Au moment de l'initialisation
55
55
56
56
* 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
59
59
60
60
Au moment du rendu
61
61
@@ -69,26 +69,26 @@ Au moment du rendu
69
69
* Initialiser les _ uniforms_ pour les choses que vous souhaitez dessiner
70
70
* Appelez ` gl.uniformXXX ` pour chaque _ uniform_
71
71
* Appelez ` gl.activeTexture ` et ` gl.bindTexture ` pour assigner les textures
72
- aux _ texture unit_
72
+ aux _ textures unit_
73
73
* Appelez ` gl.drawArrays ` ou ` gl.drawElements `
74
74
75
75
C'est aussi simple que ça. C'est à vous d'organiser votre code pour
76
76
accomplir cette tâche.
77
77
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
80
80
vous avez besoin d'attendre que ce soit téléchargé sur le net.
81
81
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.
83
84
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 ) .
88
88
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 .
92
92
93
93
// Passed in from the vertex shader.
94
94
varying vec4 v_color;
@@ -100,7 +100,7 @@ So here's the code. Our shader is the same one simple shader from our
100
100
}
101
101
102
102
103
- At init time
103
+ Au moment de l'initialisation
104
104
105
105
// Our uniforms for each thing we want to draw
106
106
var sphereUniforms = {
@@ -121,7 +121,7 @@ At init time
121
121
var cubeTranslation = [-40, 0, 0];
122
122
var coneTranslation = [ 40, 0, 0];
123
123
124
- At draw time
124
+ Au moment du dessin
125
125
126
126
var sphereXRotation = time;
127
127
var sphereYRotation = time;
@@ -180,23 +180,24 @@ At draw time
180
180
181
181
gl.drawArrays(gl.TRIANGLES, 0, coneBufferInfo.numElements);
182
182
183
- And here's that
183
+ Et voilà !
184
184
185
185
{{{example url="../webgl-multiple-objects-manual.html" }}}
186
186
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.
190
191
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 :
193
194
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
197
198
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
200
201
201
202
var objectsToDraw = [
202
203
{
@@ -216,7 +217,7 @@ and in that array put the 3 things together
216
217
},
217
218
];
218
219
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
220
221
221
222
var sphereXRotation = time;
222
223
var sphereYRotation = time;
@@ -244,7 +245,7 @@ At draw time we still need to update the matrices
244
245
coneXRotation,
245
246
coneYRotation);
246
247
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
248
249
249
250
// ------ Draw the objects --------
250
251
@@ -265,19 +266,19 @@ But the drawing code is now just a simple loop
265
266
});
266
267
267
268
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 .
271
272
272
273
{{{example url="../webgl-multiple-objects-list.html" }}}
273
274
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 .
279
280
280
- So, a very simple optimization might look like this
281
+ Ainsi, une optimisation très simple pourrait ressembler à ceci
281
282
282
283
var lastUsedProgramInfo = null;
283
284
var lastUsedBufferInfo = null;
@@ -311,8 +312,8 @@ So, a very simple optimization might look like this
311
312
gl.drawArrays(gl.TRIANGLES, 0, bufferInfo.numElements);
312
313
});
313
314
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.
316
317
317
318
// put the shapes in an array so it's easy to pick them at random
318
319
var shapes = [
@@ -351,7 +352,7 @@ the list of things to draw larger
351
352
});
352
353
}
353
354
354
- At render time
355
+ Au moment du rendu
355
356
356
357
// Compute the matrices for each object.
357
358
objects.forEach(function(object) {
@@ -363,53 +364,56 @@ At render time
363
364
object.yRotationSpeed * time);
364
365
});
365
366
366
- Then draw the objects using the loop above.
367
+ Le rendu des objets utilisant la boucle ci-dessus
367
368
368
369
{{{example url="../webgl-multiple-objects-list-optimized.html" }}}
369
370
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.
380
382
381
383
<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 ) .
414
418
415
419
0 commit comments