@@ -6,10 +6,10 @@ TOC: Dessiner plusieurs choses
66Cet article est la suite de [ WebGL Les bases] ( webgl-fundamentals.html ) .
77Si 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
1010avec 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,
1313WebGL comme avoir une fonction écrite par une personne qui au lieu de passer tous
1414les paramètres à celle-ci, vous aviez une simple fonction qui affiche des choses et
1515plus 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`,
4646les 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
5050quand les fonctions ` gl.drawArrays ` ou ` gl.drawElements ` sont appelées.
5151
5252Sachant cela, un programme WebGL typique aura la structure suivante.
5353
5454Au 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
6060Au 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
7575C'est aussi simple que ça. C'est à vous d'organiser votre code pour
7676accomplir 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
8080vous 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