Pure Data vs OpenGL

C'est une librairie pour faire du rendu 3D sur une carte graphique

  • par défaut, si on dessine un triangle rouge, le triangle va être rempli en rouge
  • le pipeline par défaut est assez limité : possibilité de moduler l'opacité, le mode de mélange

Les développeurs d'OpenGL ont développé la possibilité d'amplifier ces possibilités avec ce qu'on appelle un “Shader” car ils étaient surtout utilisés pour faire des ombres

En OpenGL 3, il n'y aura plus de pipeline par défaut, que des shaders

Glsl est un langage opengl “élégant” et couramment utilisé On compile le shader sur la carte graphique

Un shader est composé de :

  • fichier de vertex : les sommets
  • fichier de fragment : rendu des pixels dans un framebuffer (zone tampon dans la mémoire de la CG où sont stockés des informations en RGBA le plus souvent)* les “uniform” sont des variables que l'on peut changer dans le programme d'accueil

les types :

  • les floats
  • les textures
  • les vecteurs (liste de float), de 2, 3 ou 4 points (vec2, vec3, vec4)

les points

La scène 3D dans laquelle on va pouvoir afficher des contenus : le frustrum

  • fig:ViewFrustum 01.png

En utilisant l'objet [ortho], la projection est parallèle en tout point ce qui fait que la forme géométrique n'apparait pas déformée en changeant le point de vu

fragment carré : coin en bas à gauche à 0,0 en x,y coin en haut à droite à 1,1

Vertices

  • coordonnée de l'objet
  • matrice modelview : espace de vue, placement de chaque objet en 3D
  • matrice de perspective/projection

matrice modelview * matrice de projection = ce que l'on obtient à l'écran

une fois qu'on a fait la projection, rasterisation, on passe dans les fragments

510px-Position_des_shaders_dans_le_pipeline.svg.png 510px-Position_des_shaders_dans_le_pipeline.svg.png

Un Shader simple

Gem>exemples>glsl>01.texture.pd

  • fig:Capture-01.pd-extended-extra-Gem-examples-10.glsl.png

le fichier texture.vert :

 // Cyrille Henry 2007
 void main()
 {
   gl_TexCoord[0] = gl_MultiTexCoord0;
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
 }

pour chacun des sommets, c'est exécute, ça donne la position du sommet (qui ici ne change pas) et la position de la texture pour ce sommet (qui ne change pas non plus)

le main est ainsi appelé 4 fois

le fichier texture.frag :

 // Cyrille Henry 2007
 //#extension GL_ARB_texture_rectangle : enable
 //uniform sampler2DRect MyTex;
 uniform sampler2D MyTex;
 uniform float B,C;
 
 void main (void)
 {
 // vec4 color = texture2DRect(MyTex, gl_TexCoord[0].st);
  vec4 color = texture2D(MyTex, gl_TexCoord[0].st);
  color *= B+1.; // brightness
  vec4 gray = vec4(dot(color.rgb,vec3(0.2125,  0.7154, 0.0721)));
  color = mix(gray, color, C+1.); // contrast
  gl_FragColor = color;
 }

Il y a des textures carrés (puissance de 2 obligatoires) et les textures rectangles (ajoutées récemment)

 //#extension GL_ARB_texture_rectangle : enable ARB : extension acceptée par le bureau de révision OpenGl

3 variables uniform (on peut les changer à partir du programme hote) : MyTex, B et C
uniform sampler2D MyTex; par défaut, MyTex est la variable de texture, ici elle est carrée

  vec4 color = texture2D(MyTex, gl_TexCoord[0].st);

on va lire la couleur de la texture aux coordonnées du pixel dont on est en train de faire le rendu

  gl_FragColor = color;

on va écrire la couleur désirée dans la variable gl_FragColor

  vec4 gray = vec4(dot(color.rgb,vec3(0.2125,  0.7154, 0.0721)));

on veut calculer la luminance selon RGB, les valeurs indiqués sont toujours les mêmes quand il s'agit de calculer le niveau de gris à partir du RGB, on considère moins la valeur de rouge que le vert et bleu déclaration des variables à la volée, on peut aussi garder des valeurs de variables en les déclarant

  color = mix(gray, color, C+1.); // contrast

on additionne ensemble le gris et la couleur selon la valeur de contraste

Entre le vertex et le fragment il faut passer l'ID du vertex et du fragment au programme avec le message [link< pour que le [glsl-program] sache quoi compiler

  • Un reccueil de shaders GLSL pour Pure Data GEM réalisés durant un atelier à Labomedia en février 2012 et des exemples issus des participants au forum codelab : https://github.com/b01xy/glsl

Opengl

GLSL

Shaders

  • pure_data_vs_opengl.txt
  • Dernière modification: 2018/09/05 22:23
  • par Benjamin Labomedia