Ta réaction face à WebGL, ne présage rien de bon pour l’avenir de cette technologie, car elle semble partagée par de nombreux développeurs Web.
Il n’y pourtant rien d’effrayant ! Certes les concepts sont plus éloignés du "Turtle programming" ( que l’on apprend en primaire, d’ailleurs es ce toujours le cas ?) que l’API canvas 2D.
De plus le pipeline de rendus graphique programmable par shader a énormément simplifié le concept, qui schématiquement est le suivant :
1-Constitution d’un VertexBuffer : comme son nom l’indique il s’agit de définir les propriétés statiques de chaque sommet, comme ca position (vecteur [x,y,z]) ces coordonnées de textures (vecteur [u,v]), des couleurs émissive, diffuse , etc .. .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 var quadVertexBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, quadVertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array( [ // x y z u v -1.0, -1.0, 0.0, 0.0, 0.0, //sommet bas gauche 1.0, -1.0, 0.0, 1.0, 0.0, //sommet bas droit 1.0, 1.0, 0.0, 1.0, 1.0, //sommet haut droit -1.0, 1.0, 0.0, 0.0, 1.0 //sommet haut gauche ]), gl.STATIC_DRAW);
2- L’écriture d’un vertex shader, c’est la phase de projection 3D -> 2D ce microprogramme ecrit en GLSL s’exécute sur tous tes sommets de manière parallèle, les propriétés sont accessibles par les variables global de type attribute .
Pour la 3D isométrique la matrice de projection semble être la suivante :
Cela donnera un vertex shader s’approchant de ceci :
je te conseil de toujours résoudre tes équations linéaire par des solutions géométrique, car le calcule matriciel est également parallélisé sur GPU.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 attribute vec3 position; #define K1 0.70710678118654752440084436210485 // sqrt(2)/2 #define K2 0.40824829046386301636621401245098 // 1/sqrt(6) #define K3 0.81649658092772603273242802490196 // sqrt(2/3) void main(void) { mat3x2 projection = mat3x2( K1, -K1, 0.0, -K2, -K2 , K3); gl_Position = projection * position }
3- L’écriture d’un pixel ou fragment shader, ce microprogramme écrit en GLSL s’exécute, de manière parallèle, sur tous les pixels de ton canvas afin de déterminer la couleur de celui-ci.
Pour un rendu flat bleu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void main(void) { // R G B A gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);// couleur bleu }
4- Boucle de rendu :
a chaque rendu tu doit, en gros:
- activer le couple de shader (vertex et pixel) avec gl.useProgram
- activer le vertexbuffer avec gl.bindBuffer
- mapper les attributs du vertex shader à partir du vertexbuffer avec gl.vertexAttribPointer
- définir les éventuels variable uniform de tes shader ( par exemple la texture à utiliser ) avec gl.uniform*
- rendre tes polygones avec gl.drawArrays ou gl.drawElements,
je te conseil d’utiliser drawElements, cela semble plus fastidieux à mettre en place, mais cela permet de réutiliser un même sommet pour plusieurs triangles.
Sur quel aspect bloque tu ? je suis pas vraiment intéressé par la conception d’un moteur 3D iso, mais je peux, éventuellement, t’aider à comprendre les principe de base de rendu WebGL, bien que je ne suis pas un expert ...
Partager