Partager l'article ! Génèse: Genèse ...
Genèse
Vidéo:
Information : C++ + openGL + GLSL sous Visual Studio
Génèse est un logiciel de simulation visant à créer son propre système planétaire de manière
intuitive.
Etape 1 : l'implémentation d’un contexte openGL et
SDL.
Comment faire fonctionner SDL et openGL ensemble ? Rien de plus simple : SDL offre un contexte pour openGL.
Ainsi, l’architecture de base de mon programme est celle d’un programme SDL avec une boucle de rendu openGL. Cette boucle contient une fonction d’affichage avec les traitements openGL
correspondants. Pour mieux comprendre comment cela fonctionne et afin de ne pas répéter ce que d’autres ont très bien expliqué, je vous invite à aller sur : http://www.siteduzero.com/tutoriel-3-5014-creez-des-programmes-en-3d-avec-opengl.html
Etape 2 : les shaders
Mon désir de travailler réellement l’aspect visuel de mes programmes m’a emmené sur la piste des shaders. Et
c’est donc ce point qui m’a demandé le plus travail. L’utilisation des shaders conjointement avec openGL s’appelle le GLSL (openGL Shading Language) .
Les shaders sont le « plus » de la 3D : ils permettent de reconfigurer le pipeline de la carte graphique pour en
modifier son fonctionnement. De ce fait, ils interviennent sur tous les rendus en fonction de ce qui est activé ou non : affichage de formes, de lumière, de profondeur, ect…. Deux types de shader
existent : le pixel shader et le vertex shader. Pour faire simple : le vertex shader intervient sur les sommets qui composent une forme et le pixel shader intervient sur chaque pixel de cette
même forme. Le but étant de reconfigurer la manière dont la carte graphique intervient sur le rendu final, ces deux types de shaders sont indissociables. Ils sont donc linkés entre eux dans ce
qui s’appelle un program. Afin d’avoir une explication complète du fonctionnement des shaders, je vous conseille fortement ces adresses : http://www.siteduzero.com/tutoriel-3-8894-les-shaders-en-glsl.html et http://www.lighthouse3d.com/opengl/glsl/ (très intéressant pour les exemples qui y sont fournis).
Une autre particularité des shaders est qu’ils ne sont pas compilés au même moment que votre programme. Ils sont
compilés au lancement de l’exécutable (et non à sa compilation). Cela implique qu’il faut implémenter leur chargement et leur compilation (même si pour ca il y a pas mal de fonctions)
Ou est la difficulté ?
La grosse difficulté du codage des shaders réside dans l’interprétation par openGL du shader. En effet, le
shader agit de manière globale sur le rendu final, mais cela dépend grandement de ce qui est activé ou non dans votre programme.
Dans la vidéo servant d’exemple, j’ai implémenté des shaders pour l’affichage des boutons et menus (effets de
fondu) et pour le soleil (effet de magma et de flamme).
Petites astuces :
- U est l’entier servant d’identifiant dans le programme openGL,
- nomDuProgram : le program (conf cour GLSL)
- varUniform, la variable Uniform dans le shader.
Ainsi, il faut pour envoyer plusieurs textures au shader :
|
Activer le numéro de texture 0 : |
glActiveTexture(GL_TEXTURE0); |
|
Appliquer la texture A voulu (appliqué en tant que texture
0): |
glBindTexture(GL_TEXTURE_2D,A); |
|
Activer le numéro de texture 1 : |
glActiveTexture(GL_TEXTURE1); |
|
Appliquer la texture B voulu (appliqué en tant que texture
1): |
glBindTexture(GL_TEXTURE_2D,B); |
|
On fait à ce moment appel à note shader : |
_shader.active(); |
|
Puis on envoi enfin au shader la texture A au shader : |
glUniform1iARB(TexA, 0); |
|
Puis on envoi enfin au shader la texture B au shader : |
glUniform1iARB(TexB, 1); |
J’attire votre attention sur les 2 dernières lignes. Contrairement à se qu’on croit, il ne faut pas envoyer les
textures A et B au shader mais le numéro correspondant en openGL. Ainsi A étant affecté à GL_TEXTURE0, on envoi 0 et B étant affecté à GL_TEXTURE1, on envoi 1.
Mais que se passe-t-il du coter de notre shader ?
uniform sampler2D texA récupère 0
uniform sampler2D texB récupère 1.
Ainsi la fonction GLSL texture2D(texA,gl_TexCoord[0].st) saura exactement qu’elle travaille sur la texture 0,
soit GL_TEXTURE0 soit A.
Afin de pouvoir aider ceux qui se lancent dans l’utilisation des shaders, vous pouvez télécharger ces différents
shaders que j'ai créé :
Le magma du soleil : http://dl.dropbox.com/u/5275341/3Dworks/shaders/shadersMagma.7z .
Apparition progressive d’une image : http://dl.dropbox.com/u/5275341/3Dworks/shaders/shaderApparitionProgressive.7z .
Transition fondu entre 2 images : http://dl.dropbox.com/u/5275341/3Dworks/shaders/TransitionEntreDeuxImages.7z .
Rotation d’une image sur un plan : http://dl.dropbox.com/u/5275341/3Dworks/shaders/shaderRotation.7z .
Etape 3 : la
skybox
![]() |
Pour pouvoir représenter l’espace autour des astres, j’ai opté pour une skybox. Ce procédé nécessite l’utilisation d’extensions openGL. Glew permet de facilement vérifier si l’implémentation de votre système les supporte. La skybox est en fait un cube (GL_TEXTURE_CUBE_MAP_ARB) dans lequel la caméra se trouve, toujours au centre, ce qui donne la sensation d’être dans l’espace.
|
J’ai donc créé moi-même les textures qui représentent l’espace : http://dl.dropbox.com/u/5275341/3Dworks/Skybox.7z .
Il fallait ensuite les charger. (Pour plus d’informations sur l’utilisation des skybox : http://3dworks.over-blog.com/article-systeme-solaire-47907606.html étape 6)
Etapes 4 : les textures
Pour ce qui est des textures, j’ai choisi le format jpeg. C’est donc en utilisant SDL que je procède à ce chargement puis en utilisant openGL que je convertie ces surfaces en textures. (Pour plus d’informations sur l’utilisation des textures : http://3dworks.over-blog.com/article-systeme-solaire-47907606.html étape 3)
Etape 5 : caméra
Afin de pouvoir se déplacer dans l’espace, on utilise un trackball. Ce trackball réagit fonction des mouvements
de la souris et du scrolling (pour se rapprocher et s’éloigner).
(Pour plus d’informations sur l’utilisation des textures : http://3dworks.over-blog.com/article-systeme-solaire-47907606.html étape 5)
Etape 6 : les lumières
|
|
L’éclairage est orienté afin de simuler la lumière de l’étoile sur les planètes. Il est aussi régler pour éclairer les éléments chimiques servant à construire une planète dans le menu du choix des éléments. Cette même lumière est désactivée sur le soleil (il représente lui-même la lumière) et sur les parties « menu » (Pour plus d’informations sur l’utilisation des lumières : http://3dworks.over-blog.com/article-systeme-solaire-47907606.html étape 4). |
Etape 7 : Le mouse
picking
Le mouse picking est en deux parties. La première partie est dédiée à la reconnaissance des formes openGL. Par
exemple, savoir si la sourie est sur une planète (une sphère). La deuxième partie est dédiée à la reconnaissance de formes voulues. Par exemple, sur un quad on plaque une texture dont l’image est
un rond et bien que la sourie soit sur un quad (un carré), on souhaite que la détection ne se fasse que sur le rond.
Etape 8 : La création de menus
|
L’implémentation des menus est segmentée en différentes classes: une partie « menu » et une partie « bouton ». Les boutons ont des propriétés et formes distinctes tandis que les menus regroupent plusieurs boutons. Dans l’exemple fourni, on affiche les boutons à l’aide des shaders. |
Etape 9 : La création d’astre.
La classe mère ASTRE peut être dérivée en classes filles : soit une PLANETE, soit une ETOILE.
Un astre possède : positions, trajectoire, identifiant, forme, taille, couleurs, textures, date de création,
composition chimique et durée de vie et un nom. Une planète possède tous ce que possède un astre avec en
plus de la vie Une étoile possède en plus une force de rayonnement. La création d’un astre constitue essentiellement l’enregistrement de nouvelles données au sein du programme.
Pour des raisons pratiques, dans la démonstration que je vous ai faite, le choix du nom d’un astre nouvellement
créé est généré automatiquement, de même que sa taille et sa vitesse. Par contre, la définition de la trajectoire et de la composition chimique de l’astre est paramétrable.
La création d'un astre fonctionne ici:
![]() |
Déterminer la composition chimique d’un astre n’a ici aucun effet, si ce n’est que la couleur est une moyenne des couleurs des différents éléments chimiques choisis. |
Déterminer la trajectoire de l'astre consiste en 3 étapes :
|
Choisir un astre qui va servir de référentiel : un simple clic sur un astre fait de cet astre un point référent. |
|
Choisir où positionner notre nouvel astre. |
|
Choisir l’inclinaison et le sens de parcours de l’astre nouvellement créé. |
Etape 10 : afficher du texte
Ce n’est pas aussi simple que l’on pourrait le croire. En effet, SDL permet facilement d’afficher grâce à
sa librairie TTF du texte à l’écran mais pas dans un contexte openGL. Si vous ne connaissez pas encore cette librairie, je vous invite à vous rendre sur : http://www.siteduzero.com/tutoriel-3-14144-ecrire-du-texte-avec-sdl-ttf.html .
Pour pouvoir afficher du texte, il faut :
Voici la fonction setNom() permettant tout cela
|
GLuint _texte; //soit la texture qui contient le nom de l’astre: ce qui permet l'affichage de celui-ci.
//nom est le texte que l’on souhait afficher
//on spécifie la texture sur
laquelle agiront les opérations futures |
Utilisation :
GLfloat taille_texte[2]; //les dimensions du texte à afficher ( à vous de
choisir)
glEnable(GL_TEXTURE_2D); //on active la gestion de texture 2D
openGL
glBindTexture(GL_TEXTURE_2D,_texte); //on souhaite utiliser notre texture qui
contient notre texte
glBegin(GL_QUADS);
glTexCoord2d(1,0);
glVertex3f(0, taille_texte[1],-taille_texte[0]);
glTexCoord2d(0,0);
glVertex3f(0, taille_texte[1],taille_texte[0]);
glTexCoord2d(0,1);
glVertex3f(0,-taille_texte[1],taille_texte[0]);
glTexCoord2d(1,1);
glVertex3f(0,-taille_texte[1],-taille_texte[0]);
glEnd();
glDisable(GL_TEXTURE_2D); //on désactive la gestion de texture 2D
openGL
Etape 11 : la gestion du temps
J’ai créé une variable statique dans une classe de gestion du temps qui se calle sur la variable de gestion du
temps de boucle.
Qui plus est, grâce à la gestion du temps de boucle et du FPS, le temps est en seconde. Ainsi, lorsque j’indique
comme vitesse de trajectoire à un astre : 1, il fait 1 tour en 1 seconde. Lorsque je lui indique 1/10, il met 10 secondes pour faire un tour.
Afin d’implémenter ce genre de système je vous conseille : http://www.siteduzero.com/tutoriel-3-14136-maitrisez-le-temps.html .
Etape 12 : La musique
Mettre en place de la musique dans une application est simple grâce à SDL et plus précisément grâce à la
bibliothèque : SDL_mixer : http://www.siteduzero.com/tutoriel-3-80307-jouer-du-son-avec-sdl-mixer.html .
Les résultats en images:

Damien