WebGL - Dessiner un Quadrilatère

Bonjour, futurs développeurs web ! Aujourd'hui, nous allons entreprendre un voyage passionnant dans le monde du WebGL, où nous allons apprendre à dessiner un quadrilatère (ou "quad" pour faire court). Ne vous inquiétez pas si vous êtes nouveau dans la programmation - je vais vous guider à chaque étape avec la patience d'un enseignant chevronné qui a aidé des centaines d'étudiants comme vous.

WebGL - Drawing a Quad

Qu'est-ce que WebGL ?

Avant de plonger dans le dessin des quads, penchons-nous un instant sur ce qu'est WebGL. WebGL (Web Graphics Library) est une API JavaScript puissante qui nous permet de créer des graphiques 2D et 3D époustouflants dans les navigateurs web. C'est comme avoir un pinceau magique qui peut donner vie à votre imagination sur une page web !

Étapes pour Dessiner un Quadrilatère

Maintenant, décomposons le processus de dessiner un quad en étapes gérables. Pensez-y comme construire une maison - nous allons commencer par les fondations et monter progressivement.

Étape 1 : Configurer le Canvas HTML

Tout d'abord, nous avons besoin d'un canevas sur lequel dessiner. En HTML, nous utilisons l'élément <canvas>. C'est comme préparer un chevalet pour la peinture.

<canvas id="myCanvas" width="600" height="400">
Votre navigateur ne supporte pas la balise HTML5 canvas.
</canvas>

Étape 2 : Initialiser le Contexte WebGL

Ensuite, nous devons obtenir notre contexte WebGL. C'est comme拾起我们的神奇WebGL画笔。

const canvas = document.getElementById('myCanvas');
const gl = canvas.getContext('webgl');

if (!gl) {
console.log('WebGL non supporté, recours à experimental-webgl');
gl = canvas.getContext('experimental-webgl');
}

if (!gl) {
alert('Votre navigateur ne supporte pas WebGL');
}

Étape 3 : Créer le Shader de Vertex

Maintenant, nous allons créer un shader de vertex. Cela indique à WebGL où dessiner les coins de notre quad.

const vertexShaderSource = `
attribute vec2 a_position;
void main() {
gl_Position = vec4(a_position, 0.0, 1.0);
}
`;

const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);

Étape 4 : Créer le Shader de Fragment

Le shader de fragment détermine la couleur de notre quad. Faisons-le d'un bleu joyeux !

const fragmentShaderSource = `
precision mediump float;
void main() {
gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
}
`;

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);

Étape 5 : Créer et Lier le Programme

Maintenant, nous allons créer un programme et lier nos shaders à celui-ci. C'est comme assembler notre pinceau et notre peinture.

const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);

Étape 6 : Créer un Tampon et Charger les Données du Vertex

Il est temps de définir les coins de notre quad !

const positions = [
-0.7, -0.5,
0.7, -0.5,
0.7,  0.5,
-0.7,  0.5
];

const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);

Étape 7 : Connecter le Tampon de Position à l'Attribut

Nous devons indiquer à WebGL comment lire nos données de position.

const positionAttributeLocation = gl.getAttribLocation(program, "a_position");
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);

Étape 8 : Dessiner le Quadrilatère

Enfin, le moment que nous attendions - dessinons notre quad !

gl.useProgram(program);
gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);

Exemple - Dessiner un Quadrilatère

Maintenant, mettons tout ensemble dans un exemple complet :

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebGL Quad</title>
</head>
<body>
<canvas id="myCanvas" width="600" height="400">
Votre navigateur ne supporte pas la balise HTML5 canvas.
</canvas>

<script>
const canvas = document.getElementById('myCanvas');
const gl = canvas.getContext('webgl');

if (!gl) {
alert('Votre navigateur ne supporte pas WebGL');
}

const vertexShaderSource = `
attribute vec2 a_position;
void main() {
gl_Position = vec4(a_position, 0.0, 1.0);
}
`;

const fragmentShaderSource = `
precision mediump float;
void main() {
gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
}
`;

const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);

const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);

const positions = [
-0.7, -0.5,
0.7, -0.5,
0.7,  0.5,
-0.7,  0.5
];

const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);

const positionAttributeLocation = gl.getAttribLocation(program, "a_position");
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);

gl.useProgram(program);
gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);
</script>
</body>
</html>

Et voilà ! Votre propre quad WebGL. Lorsque vous ouvrez ce fichier HTML dans un navigateur, vous devriez voir un quadrilatère bleu sur le canevas.

Conclusion

Félicitations pour avoir dessiné votre premier quadrilatère WebGL ! Nous avons couvert beaucoup de terrain aujourd'hui, de la configuration du canevas à la création des shaders et enfin le dessin de notre forme. Souvenez-vous, apprendre WebGL est comme apprendre à peindre - cela nécessite de la pratique et de la patience. Ne soyez pas découragé si cela ne fonctionne pas immédiatement. Continuez à expérimenter, et bientôt vous serez capable de créer des graphiques 3D époustouflants sur le web !

Dans notre prochaîne leçon, nous explorerons comment ajouter de l'interactivité à nos créations WebGL. Jusque-là, bon codage !

Credits: Image by storyset