Ce qui est bien avec GL c'est que le système de shader est plus complet que cela.
En GL/GL-ES, tu as deux/trois/quatre stages de shader en plus:
Vertex Shader -> (Tesselation Control -> Tesselation Evaluation) -> [Geometry shader] -> Fragment shader + Compute shader.
(Entre parenthèse ce qui est strictement GL 5, entre crochet un stage optionnel et qui est disponible en GL3 ou GLES depuis peu, mais je ne crois pas sur les navigateurs).
Respectivement le travail de chacun :
Vertex Shader
Prend des points en entrée et les transforme pour generer de nouveaux points. Un point c'est une entité arbitraire, donc cela peut être une position, mais cela peut aussi être un poulet, défini par sa couleur, sa taille, ses points de vie. Le but du vertex shader est de transformer cela pour donner un nouveau point arbitraire (cela peut donc être des mesures de température liés à une date)
Pour être très honette, le viewer sur glsl sandbox utilise (obligatoirement) un Vertex Shader avec 4 points positionnés au quatre coins de l'écran. (Je n'ai pas regardé le code, on peut aussi faire autrement, mais ce serait vicieux ;)
Controle et Evaluation Tesselation Shader
Je groupe ces deux shaders car ils sont liés. Ils prennent en entrée des points et vont générer pleins de triangles/lignes. C'est généralement utilisé pour lisser les objets, mais on peut s'en servir de façon détournée (pour faire des cheveux par exemples, en générant pleins de lignes)
Geometry Shader
Celui-ci est tordu. Sont but est de prendre une primitive (i.e. un assemblage de points) et de générer une/plusieurs nouvelles primitives. Dans les grandes ligne GL ne connaît que trois primitives (point, ligne, triangle) (c'est encore faux, mais bon, vous lirez la doc pour plus). Un exemple d'utilisation du geometry shader pourrait être de convertir un point en triangles. Exemple vous avez un arbre, représenté par un point contenant une couleur, une position, une taille, un type de feuille et vous aller mettre un tas de triangle à la place.
Generalement on utilise le géometrie shader pour des cas tordus, d'autant qu'il est lent, donc on le réserve pour des usages bizarres ;)
Ici il faut faire une pause. Tout ces traitement ont eu lieu sur des points arbitraires (comme je le disais, des poulets), mais maintenant il faut savoir quoi afficher à l'écran. Pour cela il faut connaître la position 3D de vos points. Ainsi nos points qui étaient arbitraire au depart doivent sortir du geometry shader (ou du tesselation si le geometry n'est pas utilisé, ou du vertex shader si ni geometry ni tesselation ne sont activés) avec une position.
Ainsi on passe d'un point arbitraire (un poulet) à un point positioné dans l'espace avec des attributs arbitraires (i.e.: une position associée à une couleur, une taille, une agressivité et des points de vie).
A ce moment, la carte graphique va decider des pixels qui sont couverts par notre primitive et pour chacun de ses pixels elle va appeler le fragment shader (i.e.: le seul bout de code disponible dans l’outil presenté dans ce journal)
Fragment shader
Sert à donner une couleur et une profondeur à un pixel en fonction des attributs interpolés des points passés en paramètre pour dessiner une primitive.
Vous l'aurez conclu vous même, sans control sur les points passés en paramètre et sur le type de primitive, le fragment shader ne sert qu'a "donner une couleur à un pixel arbitraire" et c'est super limité !
Relativisons, on peut faire pleins de choses, mais comparé à ce qui est normalement faisable dans GL, c'est limité.
Il reste un dernier shader (GL4.3 dernièrement) c'est le Compute shader, qui sert à tout faire, et même le café, sans aucune aide de la part du GPU pour par exemple afficher. C'est moins limité, mais plus lent dans certains cas, donc il faut l'utiliser au bon endroit.
tl;dr
C'est limité, GL permet de faire tellement plus de chose. Mais c'est tout de même cool !
# C'est trop limité ;)
Posté par Guillaum (site web personnel) . En réponse au journal Galeries de shaders GLSL et fond d'écran animé pour Android. Évalué à 10.
Ce qui est bien avec GL c'est que le système de shader est plus complet que cela.
En GL/GL-ES, tu as deux/trois/quatre stages de shader en plus:
Vertex Shader -> (Tesselation Control -> Tesselation Evaluation) -> [Geometry shader] -> Fragment shader + Compute shader.
(Entre parenthèse ce qui est strictement GL 5, entre crochet un stage optionnel et qui est disponible en GL3 ou GLES depuis peu, mais je ne crois pas sur les navigateurs).
Respectivement le travail de chacun :
Vertex Shader
Prend des points en entrée et les transforme pour generer de nouveaux points. Un point c'est une entité arbitraire, donc cela peut être une position, mais cela peut aussi être un poulet, défini par sa couleur, sa taille, ses points de vie. Le but du vertex shader est de transformer cela pour donner un nouveau point arbitraire (cela peut donc être des mesures de température liés à une date)
Pour être très honette, le viewer sur glsl sandbox utilise (obligatoirement) un Vertex Shader avec 4 points positionnés au quatre coins de l'écran. (Je n'ai pas regardé le code, on peut aussi faire autrement, mais ce serait vicieux ;)
Controle et Evaluation Tesselation Shader
Je groupe ces deux shaders car ils sont liés. Ils prennent en entrée des points et vont générer pleins de triangles/lignes. C'est généralement utilisé pour lisser les objets, mais on peut s'en servir de façon détournée (pour faire des cheveux par exemples, en générant pleins de lignes)
Geometry Shader
Celui-ci est tordu. Sont but est de prendre une primitive (i.e. un assemblage de points) et de générer une/plusieurs nouvelles primitives. Dans les grandes ligne GL ne connaît que trois primitives (point, ligne, triangle) (c'est encore faux, mais bon, vous lirez la doc pour plus). Un exemple d'utilisation du geometry shader pourrait être de convertir un point en triangles. Exemple vous avez un arbre, représenté par un point contenant une couleur, une position, une taille, un type de feuille et vous aller mettre un tas de triangle à la place.
Generalement on utilise le géometrie shader pour des cas tordus, d'autant qu'il est lent, donc on le réserve pour des usages bizarres ;)
Ici il faut faire une pause. Tout ces traitement ont eu lieu sur des points arbitraires (comme je le disais, des poulets), mais maintenant il faut savoir quoi afficher à l'écran. Pour cela il faut connaître la position 3D de vos points. Ainsi nos points qui étaient arbitraire au depart doivent sortir du geometry shader (ou du tesselation si le geometry n'est pas utilisé, ou du vertex shader si ni geometry ni tesselation ne sont activés) avec une position.
Ainsi on passe d'un point arbitraire (un poulet) à un point positioné dans l'espace avec des attributs arbitraires (i.e.: une position associée à une couleur, une taille, une agressivité et des points de vie).
A ce moment, la carte graphique va decider des pixels qui sont couverts par notre primitive et pour chacun de ses pixels elle va appeler le fragment shader (i.e.: le seul bout de code disponible dans l’outil presenté dans ce journal)
Fragment shader
Sert à donner une couleur et une profondeur à un pixel en fonction des attributs interpolés des points passés en paramètre pour dessiner une primitive.
Vous l'aurez conclu vous même, sans control sur les points passés en paramètre et sur le type de primitive, le fragment shader ne sert qu'a "donner une couleur à un pixel arbitraire" et c'est super limité !
Relativisons, on peut faire pleins de choses, mais comparé à ce qui est normalement faisable dans GL, c'est limité.
Il reste un dernier shader (GL4.3 dernièrement) c'est le Compute shader, qui sert à tout faire, et même le café, sans aucune aide de la part du GPU pour par exemple afficher. C'est moins limité, mais plus lent dans certains cas, donc il faut l'utiliser au bon endroit.
tl;dr
C'est limité, GL permet de faire tellement plus de chose. Mais c'est tout de même cool !