You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Dans [WebGL -Les Bases](webgl-fundamentals.html) on a vu qu'on pouvait se passer d'opération dans
64
+
Dans [WebGL -Les Bases](webgl-fundamentals.html) on a vu qu'on pouvait se passer d'opération dans
67
65
le shader de vertex et juste lui envoyer des données.
68
66
69
67
attribute vec4 a_position;
@@ -78,7 +76,7 @@ Les attributs peuvent être de type `float`, `vec2`, `vec3`, `vec4`, `mat2`, `ma
78
76
79
77
### Les uniforms dans les shaders de vertex
80
78
81
-
Pour un vertex shader les uniforms sont des valeurs qui restent identiques pour tous les vertices d'un appel de rendu.
79
+
Pour un vertex shader les uniforms sont des valeurs qui restent identiques pour tous les vertices d'un appel de rendu.
82
80
Un exemple très simple est d'ajouter un décalage dans le shader de vertex précédent :
83
81
84
82
attribute vec4 a_position;
@@ -88,7 +86,7 @@ Un exemple très simple est d'ajouter un décalage dans le shader de vertex pré
88
86
gl_Position = a_position + u_decalage;
89
87
}
90
88
91
-
Et maintenant on pourrait décaler chaque vertex d'une certaine distance. D'abord
89
+
Et maintenant on pourrait décaler chaque vertex d'une certaine distance. D'abord
92
90
on définit un emplacement pour la uniform :
93
91
94
92
var emplacementDecalage = gl.getUniformLocation(programme, "u_decalage");
@@ -97,7 +95,7 @@ Ensuite, on renseigne la valeur avant l'appel de rendu.
97
95
98
96
gl.uniform4fv(emplacementDecalage, [1, 0, 0, 0]); // décale vers la droite de la moitié de l'écran
99
97
100
-
Les uniforms peuvent avoir de nombreux types. Pour chaque type il faut appeler une fonction spéciale pour la renseigner.
98
+
Les uniforms peuvent avoir de nombreux types. Pour chaque type il faut appeler une fonction spéciale pour la renseigner.
101
99
102
100
gl.uniform1f (emplacementFloat, v); // pour les float
103
101
gl.uniform1fv(emplacementFloat, [v]); // pour les float ou tableaux de float
@@ -129,7 +127,7 @@ Les uniforms peuvent avoir de nombreux types. Pour chaque type il faut appeler u
129
127
130
128
Il y a aussi les types `bool`, `bvec2`, `bvec3` et `bvec4`. Ils utilisent les fonctions `gl.uniform?f?` ou `gl.uniform?i?`.
131
129
132
-
Notons que pour un tableau vous pouvez indiquez toutes les uniforms d'un coup. Par exemple :
130
+
Notons que pour un tableau vous pouvez indiquer toutes les uniforms d'un coup. Par exemple :
133
131
134
132
// dans le shader
135
133
uniform vec2 u_monVec2[3];
@@ -171,7 +169,7 @@ Voire [Les textures dans les shaders de fragment](#les-textures-dans-les-shaders
171
169
172
170
## Les shaders de fragment
173
171
174
-
Le rôle d'un shader de fragment est de colorier le pixel en cours.
172
+
Le rôle d'un shader de fragment est de colorier le pixel en cours.
175
173
Il prend toujours la forme
176
174
177
175
precision mediump float;
@@ -194,7 +192,7 @@ Voire [Les uniforms dans les shaders de vertex](#les-uniforms-dans-les-shaders-d
194
192
195
193
### Les textures dans les shaders de fragment
196
194
197
-
Pour obtenir une valeur depuis une texture dans un shader, on créé une uniform de type `sampler2D`et
195
+
Pour obtenir une valeur depuis une texture dans un shader, on créé une uniform de type `sampler2D`et
198
196
on utilise la fonction `texture2D`.
199
197
200
198
precision mediump float;
@@ -234,11 +232,11 @@ Et de dire au shader à quelle unité on a lié notre texture
234
232
235
233
### Les varyings
236
234
237
-
Une varying est un moyen de passer une valeur d'un shader de vertex à un shader de fragment
235
+
Une varying est un moyen de passer une valeur d'un shader de vertex à un shader de fragment
238
236
comment nous l'avons vu [WebGL - Comment ça marche](webgl-how-it-works.html).
239
237
240
-
Pour utiliser une varying on doit effectuer la même déclaration dans les deux shaders.
241
-
On la renseigne dans le shader de vertex. Quand WebGL colore les pixels les valeurs interpolées
238
+
Pour utiliser une varying on doit effectuer la même déclaration dans les deux shaders.
239
+
On la renseigne dans le shader de vertex. Quand WebGL colore les pixels les valeurs interpolées
242
240
sont envoyées au shader de fragment.
243
241
244
242
Shader de vertex
@@ -266,16 +264,16 @@ Shader de fragment
266
264
+ gl_FragColor = color;
267
265
}
268
266
269
-
L'exemple ci-dessus n'a pas vraiment d'intérêt. Copier les valeurs en espace de projection d'un shader à l'autre
267
+
L'exemple ci-dessus n'a pas vraiment d'intérêt. Copier les valeurs en espace de projection d'un shader à l'autre
270
268
pour les utiliser comme couleurs n'a pas de sens. Mais ça fonctionne et les couleurs sont renseignées.
271
269
272
270
## GLSL
273
271
274
-
GLSL signifie Graphics Library Shader Language. C'est le langage dans lequel les shaders
275
-
sont écrits. Il a des façons de faire qui n'ont rien à voir avec le javascript. Il est
276
-
conçu pour les opérations propres aux calculs graphiques. Par exemple il a des types
277
-
natifs comme `vec2`, `vec3`, et `vec4` qui représentent respectivement 2 valeurs, 3 valeurs et 4 valeurs.
278
-
De même il a `mat2`, `mat3` et `mat4` qui représentent des matrices carrées 2x2, 3x3, et 4x4.
272
+
GLSL signifie Graphics Library Shader Language. C'est le langage dans lequel les shaders
273
+
sont écrits. Il a des façons de faire qui n'ont rien à voir avec le javascript. Il est
274
+
conçu pour les opérations propres aux calculs graphiques. Par exemple il a des types
275
+
natifs comme `vec2`, `vec3`, et `vec4` qui représentent respectivement 2 valeurs, 3 valeurs et 4 valeurs.
276
+
De même il a `mat2`, `mat3` et `mat4` qui représentent des matrices carrées 2x2, 3x3, et 4x4.
279
277
On peut faire nativement des opérations comme multiplier un `vec` par un scalaire.
280
278
281
279
vec4 a = vec4(1, 2, 3, 4);
@@ -295,12 +293,12 @@ Il a aussi plusieurs sélecteurs pour choisir facilement les valeurs d'un vec. P
295
293
296
294
vec4 v;
297
295
298
-
*`v.x` est identique à `v.s`, à `v.r` et à `v[0]`.
299
-
*`v.y` est identique à `v.t`, à `v.g` et à `v[1]`.
300
-
*`v.z` est identique à `v.p`, à `v.b` et à `v[2]`.
301
-
*`v.w` est identique à `v.q`, à `v.a` et à `v[3]`.
296
+
-`v.x` est identique à `v.s`, à `v.r` et à `v[0]`.
297
+
-`v.y` est identique à `v.t`, à `v.g` et à `v[1]`.
298
+
-`v.z` est identique à `v.p`, à `v.b` et à `v[2]`.
299
+
-`v.w` est identique à `v.q`, à `v.a` et à `v[3]`.
302
300
303
-
Ce qui permet de *mixer* les composantes d'un vec, donc de les exclure ou de les répéter
301
+
Ce qui permet de _mixer_ les composantes d'un vec, donc de les exclure ou de les répéter
304
302
305
303
v.yyyy
306
304
@@ -333,15 +331,15 @@ La bonne façon de faire pour ça :
333
331
float f = 1.0; // indiquer une décimale bien sûr
334
332
float f = float(1) // ou transformer l'entier en décimale
335
333
336
-
L'exemple précédent de `vec4(v.rgb, 1)` reste valide car `vec4` convertit naturellement ses composantes en décimales,
334
+
L'exemple précédent de `vec4(v.rgb, 1)` reste valide car `vec4` convertit naturellement ses composantes en décimales,
337
335
comme `float(1)`.
338
336
339
-
GLSL a aussi un tas de fonctions natives. Nombre d'entre elles agissent sur plusieurs composantes
337
+
GLSL a aussi un tas de fonctions natives. Nombre d'entre elles agissent sur plusieurs composantes
340
338
d'un coup. Par exemple :
341
339
342
340
T sin(T angle)
343
341
344
-
T signifie que la valeur peut être un `float`, un `vec2`, un `vec3` ou un `vec4`. Si on lui donne un `vec4` on reçoit un `vec4` en retour,
342
+
T signifie que la valeur peut être un `float`, un `vec2`, un `vec3` ou un `vec4`. Si on lui donne un `vec4` on reçoit un `vec4` en retour,
345
343
avec le sinus de chacun de ses composants. En d'autres termes si `v` est un `vec4` alors
346
344
347
345
vec4 s = sin(v);
@@ -350,7 +348,7 @@ est identique à
350
348
351
349
vec4 s = vec4(sin(v.x), sin(v.y), sin(v.z), sin(v.w));
352
350
353
-
Parfois un argument est un float est le reste `T`. Ca signifie que le float sera appliqué à tous les composants.
351
+
Parfois un argument est un float est le reste `T`. Ca signifie que le float sera appliqué à tous les composants.
354
352
Par exemple si `v1` et `v2` sont des `vec4` et `f` est un float
355
353
356
354
vec4 m = mix(v1, v2, f);
@@ -363,19 +361,19 @@ est identique à
363
361
mix(v1.z, v2.z, f),
364
362
mix(v1.w, v2.w, f));
365
363
366
-
Il y a une liste de toutes les fonctions GLSL sur la dernière page de [la référence WebGL](https://www.khronos.org/files/webgl/webgl-reference-card-1_0.pdf). Si vous aimez les bon gros contenus bruts vous pouvez tenter [la spéc GLSL](https://www.khronos.org/files/opengles_shading_language.pdf).
364
+
Il y a une liste de toutes les fonctions GLSL sur la dernière page de [la référence WebGL](https://www.khronos.org/files/webgl/webgl-reference-card-1_0.pdf). Si vous aimez les bon gros contenus bruts vous pouvez tenter [la spéc GLSL](https://www.khronos.org/files/opengles_shading_language.pdf).
367
365
368
366
## Conclusion
369
367
370
-
C'est le bout de cette série d'articles. WebGL c'est surtout écrire des shaders,
371
-
fournir les données à ces shaders et enfin exécuter `gl.drawArrays` ou `gl.drawElements`
372
-
pour que WebGL en déduise les vertices en appelant le shader de vertex pour chacun d'entre eux, et
368
+
C'est le bout de cette série d'articles. WebGL c'est surtout écrire des shaders,
369
+
fournir les données à ces shaders et enfin exécuter `gl.drawArrays` ou `gl.drawElements`
370
+
pour que WebGL en déduise les vertices en appelant le shader de vertex pour chacun d'entre eux, et
373
371
colorie les pixels avec le fragment shader.
374
372
375
-
En fait les shaders demandent plusieurs lignes de code. Ces lignes sont les mêmes dans la plupart des programmes
373
+
En fait les shaders demandent plusieurs lignes de code. Ces lignes sont les mêmes dans la plupart des programmes
376
374
et une fois écrites on peut les oublier [comme les méthodes décrites ici, pour compiler des shaders et les lier à un programme](webgl-boilerplate.html).
377
375
378
-
Arrivé ici vous avez deux choix : si vous êtes intéressé par le traitement
376
+
Arrivé ici vous avez deux choix : si vous êtes intéressé par le traitement
379
377
d'image je vais vous montrer [comment faire du traitement d'images 2D](webgl-image-processing.html).
380
-
Si vous voulez apprendre les translations, rotations et changements d'échelle alors
381
-
[c'est par ici](webgl-2d-translation.html).
378
+
Si vous voulez apprendre les translations, rotations et changements d'échelle alors
0 commit comments