Mélange de couleurs dans OpenGL sous Windows
Introduction
Il reste encore une chose à voir au niveau des couleurs...
Il va s'agir ici de mélanger des couleurs entre des objets 3D. Le plus souvent, cette option sera utilisée pour rendre un objet plus ou moins transparent. Pour parvenir à cela, il a fallu ajouter un paramètre sur chaque vertice ou texels: Il s'agit de la valeur Alpha (non, pas du centaure !) que l'on peut préciser au niveau des couleurs.
Alpha
Pour les vertice, rien de plus simple pour indiquer la valeur alpha, vous allez de nouveau utiliser la fonction polyforme glColor() en passant 4 valeurs :rvbA
Pour les texels, vous l'avez déjà positionné lors du chargement des textures et lors de la définition de la texture sous OpenGL en les codants RVBA.
Les valeurs autorisées sont:
Tout va dépendre du type (entier, flottant, ...). Pour simplifier, plus la valeur est petite et plus la couleur sera confondue avec celle du point se trouvant déjà positionnée derrière. Inversement, plus elle sera grande, moins le mélange se fera.
Ou encore dans le cas de la transparence, plus la valeur est petite, plus le point est transparent, plus la valeur est grande, et plus le point est opaque .
Activation du mélangeur
Evidemment, par défaut le mélangeur est désactivé ! Il faudra donc l'activer via le déjà bien connu glEnable()
Vous lui passerez la valeur glEnable (GL_BLEND).
Il faut ensuite indiquer le type d'opération qui devra être fait entre les points à mélanger. Comme souvent, pour ce genre de fonction, plusieurs opérations sont permises. Mais en fait, vous n'en utiliserez pas beaucoup de la liste dans la vie courante (du monde OpenGL).
Le type de mélange est précisé par la fonction glBlendFunc()
void glBlendFunc(GLenum sfactor,
GLenum dfactor)
En entrée:
sfactor type d'opération sur l'image source (à afficher):
GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA et GL_SRC_ALPHA_SATURATE.
dfactor type d'opération sur l'image destination (déjà affichée):
GL_ZERO, GL_ONE, GL_SCR_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR,
GL_DST_ALPHA, and GL_ONE_MINUS_DST_ALPHA.
Les paramètres les plus courants sont (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA).
Le mélange
d'un point se faisant avec celui déjà présent dans le framebuffer.
Il faudra donc trier les objets à dessiner. En somme faire apparaître
les objets opaques qui sont plus éloignés des objets transparents,
puis les objets transparents.
Exemple
Voici un exemple complet de ce qui marche et marche pas:
Nous reprenons le cube étudié avec les textures
Voici le source en ajoutant le blending:
Et les résultats:
Aïlle, tout n'est pas transparent !
En fait, cette face avec les 3 points est dessinée alors que d'autres faces ne le sont pas encore, d'où l'absence de ces faces !
Par contre, cette face avec le point est parfaite, et en même temps, c'est normal, car elle est bien dessinée en dernier dans le code !
Donc, si nous voulons avoir toutes les faces dessinées, il faudra désactiver le depth buffer. Mais ce n'est pas tout, car il faudra aussi trier les faces pour afficher les plus lointaines (axe z) en premier, et afficher les plus proches en dernier. Sinon, nous risquerions d'avoir la face la plus lointaine affichée après celle qui est plus proche de nous, et donc un effet de transparence aurait lieu et nous aurions alors l'impression que notre face la plus proche serait recouverte par celle la plus lointaine...
Annexes
OpenGL pour Linux, Windows, Android...