Table des matières

WebGL2Fundamentals.org

Fix, Fork, Contribute

WebGL2 Points, Lignes et Triangles

La grande majorité de ce site dessine tout avec des triangles. C’est sans conteste ce que font 99% des programmes WebGL. Mais, pour être complet, passons en revue quelques autres cas.

Comme mentionné dans le premier article, WebGL dessine des points, des lignes et des triangles. Il le fait quand nous appelons gl.drawArrays ou gl.drawElements. Nous fournissons un vertex shader qui retourne des coordonnées en clip space et ensuite, selon le premier argument passé à gl.drawArrays ou gl.drawElements, WebGL va dessiner des points, des lignes ou des triangles.

Les valeurs valides pour le premier argument de gl.drawArrays et gl.drawElements sont

  • POINTS

    Pour chaque sommet en clip space retourné par le vertex shader, dessine un carré centré sur ce point. La taille du carré est spécifiée en définissant une variable spéciale gl_PointSize dans le vertex shader avec la taille souhaitée pour ce carré en pixels.

    Note : La taille maximale (et minimale) que ce carré peut avoir dépend de l’implémentation, ce que vous pouvez interroger avec

      const [minSize, maxSize] = gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE);
    

    Voir aussi un autre problème ici.

  • LINES

    Pour chaque paire de 2 sommets en clip space retournés par le vertex shader, dessine une ligne reliant les 2 points. Si nous avions les points A,B,C,D,E,F alors nous obtiendrions 3 lignes.

    La spécification indique que nous pouvons régler l’épaisseur de cette ligne en appelant gl.lineWidth et en spécifiant une épaisseur en pixels. En réalité, l’épaisseur maximale dépend de l’implémentation et pour la grande majorité des implémentations, l’épaisseur maximale est 1.

      const [minSize, maxSize] = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);
    

    Cela est principalement dû au fait que les valeurs > 1 ont été dépréciées dans le Desktop OpenGL de base.

  • LINE_STRIP

    Pour chaque sommet en clip space retourné par le vertex shader, dessine une ligne depuis le point précédent retourné par le vertex shader.

    Donc, si vous retournez les sommets A,B,C,D,E,F en clip space, vous obtiendrez 5 lignes.

  • LINE_LOOP

    C’est la même chose que LINE_STRIP, sauf qu’une ligne supplémentaire est tracée du dernier point vers le premier point.

  • TRIANGLES

    Pour chaque groupe de 3 sommets en clip space retournés par le vertex shader, dessine un triangle à partir des 3 points. C’est le mode le plus utilisé.

  • TRIANGLE_STRIP

    Pour chaque sommet en clip space retourné par le vertex shader, dessine un triangle à partir des 3 derniers sommets. En d’autres termes, si vous retournez 6 points A,B,C,D,E,F, alors 4 triangles seront dessinés. A,B,C puis B,C,D puis C,D,E puis D,E,F

  • TRIANGLE_FAN

    Pour chaque sommet en clip space retourné par le vertex shader, dessine un triangle à partir du premier sommet et des 2 derniers sommets. En d’autres termes, si vous retournez 6 points A,B,C,D,E,F, alors 4 triangles seront dessinés. A,B,C puis A,C,D puis A,D,E et enfin A,E,F

Je suis sûr que d’autres ne seront pas d’accord, mais dans mon expérience, TRIANGLE_FAN et TRIANGLE_STRIP sont à éviter. Ils ne conviennent qu’à quelques cas exceptionnels et le code supplémentaire nécessaire pour gérer ces cas ne vaut pas la peine par rapport à tout faire directement avec des triangles. En particulier, vous avez peut-être des outils pour calculer des normales ou générer des coordonnées de texture ou faire d’autres choses avec les données de sommets. En vous limitant à TRIANGLES, vos fonctions fonctionneront simplement. Dès que vous commencez à ajouter TRIANGLE_FAN et TRIANGLE_STRIP, vous avez besoin de plus de fonctions pour gérer plus de cas. Vous êtes libre de ne pas être d’accord et de faire ce que vous voulez. Je dis simplement que c’est mon expérience et celle de quelques développeurs de jeux AAA que j’ai interrogés.

De même, LINE_LOOP et LINE_STRIP ne sont pas très utiles et ont des problèmes similaires. Comme TRIANGLE_FAN et TRIANGLE_STRIP, les situations pour les utiliser sont rares. Par exemple, vous pourriez penser vouloir dessiner 4 lignes connectées, chacune composée de 4 points.

Si vous utilisez LINE_STRIP, vous devrez faire 4 appels à gl.drawArrays et plus d’appels pour configurer les attributs de chaque ligne, alors que si vous utilisez simplement LINES, vous pouvez insérer tous les points nécessaires pour dessiner les 4 ensembles de lignes avec un seul appel à gl.drawArrays. Ce sera beaucoup, beaucoup plus rapide.

De plus, LINES peut être très utile pour le débogage ou des effets simples, mais étant donné leur limite de 1 pixel de largeur sur la plupart des plateformes, c’est souvent la mauvaise solution. Si vous voulez dessiner une grille pour un graphique ou afficher les contours de polygones dans un programme de modélisation 3D, utiliser LINES peut être très bien, mais si vous voulez dessiner des graphiques structurés comme SVG ou Adobe Illustrator, cela ne fonctionnera pas et vous devez rendre vos lignes d’une autre façon, généralement à partir de triangles.

Problème ou bug ? Créez un ticket sur github.
Utilisez <pre><code>le code ici</code></pre> pour les blocs de code
comments powered by Disqus