WebGL (Web Graphics Library) est une API Javascript utilisée pour afficher des graphiques 2D et 3D dans les navigateurs sans utiliser de modules complémentaires. Elle s’appuie sur la spécification OpenGL ES (OpenGL for Embedded Systems) et est supportée nativement par la grande majorité des navigateurs actuels.
Cette API permet l’utilisation dans une page web d’un composant (canevas) capable d’afficher un modèle 3D et autorise les interactions entre ce composant et l’application. Pour effectuer le rendu d’un modèle 3D, plusieurs étapes sont réalisées selon le schéma suivant :
WebGL fournit un ensemble de méthodes qui permettent la réalisation des étapes suivantes :
Cette étape est réalisée en amont du reste du pipeline. Les étapes suivantes seront répétées pour chaque objet 3D à restituer.
Cette étape utilise les attributs définis initialement pour déterminer comment sont structurées les informations dans les différents buffers et ainsi les associer à chaque vertex. Chaque attribut définit le type de données ainsi que le nombre d’éléments requis dans le VBO pour constituer cet attribut.
Structure d’un VBO «interleaved»
Le format “interleaved” permet de stocker dans un même buffer les différentes données (ici position, couleur et coordonnées de texture). Le stride indique combien d’éléments doivent être associés à un même vertex.
Chaque définition d’attribut spécifie le décalage (offset) et le nombre d’éléments : 3 valeurs pour la position (x,y,z), 3 valeurs pour la couleur(r,g,b), 2 valeurs pour les coordonnées de texture(s,t).
Vertex Shader
Le vertex shader est un programme qui est exécuté pour chaque vertex du VBO. Il réalise la projection des sommets des primitives depuis l’espace 3D vers l’espace écran en 2D.
Primitive assembly
Cette étape réalise l’assemblage en lignes, triangles ou points.
Détermine pour chaque primitive les pixels à afficher en effectuant une interpolation entre les sommets. On peut distinguer deux fonctions principales :
Le culling : élimine les faces qui ne sont pas visibles selon leur orientation (définie par les normales). Généralement, les faces internes (backfaces), ne sont pas rendues.
Le clipping : élimine les pixels qui sont à l’extérieur de la zone de rendu.
Le fragment shader est un programme qui définit la couleur de chaque pixel qui sera rendu. Il stocke aussi la profondeur de chaque fragment (z-buffering), proportionnellement à la distance entre l’œil (la caméra) et l’objet.
Il est généralement utilisé pour réaliser les opérations d’éclairage en modifiant l’intensité de la couleur.
Lorsqu’un fragment issu du fragment shader doit être dessiné, sa profondeur est comparée à celle présente dans le z-buffer. S’il est plus éloigné, il n’est tout simplement pas rendu. S’il est plus proche, il est rendu à la place du fragment précédent.
Cette étape permet de mélanger les couleurs de différents fragments qui se superposent. Cela permet par exemple la modification (plus ou moins importante) de la couleur d’un pixel pour tenir compte de la transparence.
Cette étape permet d’appliquer un « bruit » qui vient altérer le rendu du pixel. Ce bruit peut être utilisé pour corriger certains artefacts (effet de bande par exemple) ou ajouter des effets (blur, noise).
En sortie du pipeline, le framebuffer est un tampon servant de destination au rendu. Il permet la restitution de l’image qui se fera dans le canevas ou la génération de textures qui pourront être utilisées dans d’autres pipelines.
Dans un prochain article, nous vous présenterons un exemple d’application web en utilisant la librairie ThreeJS.
Suivront aussi quelques conseils d’optimisation relatifs à nos retours d’expérience.
STAY TUNED!