I. Introduction▲
Au cours de ce tutoriel, nous allons d�couvrir la programmation de la 3D avec OpenGL.
Cette d�couverte va se faire en langage VBA ou VB6.
Cependant, les fonctions et techniques utilis�es sont les m�mes dans tous les langages.
Pour simplifier, lorsque j'emploie le terme VB, il r�f�re � VB6 ou � VBA
II. Librairies utilis�es▲
Tout d'abord OpenGL est install� avec Windows.
Il y a deux librairies pour OpenGL dans le r�pertoire syst�me de Windows :
- opengl32.dll : c'est la librairie principale
- glu32.dll = GL Utility : c'est un compl�ment qui contient quelques autres fonctions utiles
OpenGL ne g�re pas le fen�trage : c'est-�-dire qu'il faut fournir � OpenGL une fen�tre sur laquelle il va effectuer le rendu de l'image.
De plus il ne g�re pas les entr�es clavier, souris, ...
Pour g�rer l'affichage des fen�tres et des �v�nements divers (clavier, souris, minuterie, ...), il existe plusieurs librairies.
Glut est une librairie tr�s largement utilis�e.
Mais pour une utilisation en VB, je lui ai pr�f�r� freeglut qui expose des fonctions similaires, et quelques nouveaut�s qui nous seront utiles, voir indispensables en VBA.
Nous verrons qu'il est �galement possible de faire un rendu sur un formulaire sans freeglut.
Enfin pour appeler les fonctions de ces librairies, il faut d�clarer chacune d'entre-elles dans VB.
Nous allons donc pr�parer notre environnement de d�veloppement.
III. Le pack de module VB pour OpenGL▲
��
Tous les modules VB n�cessaires � l'utilisation d'OpenGL sont regroup�s dans une archive compress�e au format zip.
T�l�chargez cette archive :
Pack de module VB pour OpengGL��
Pour utiliser FreeGlut, t�l�chargez �galement la librairie dll :
Librairie FreeGlut
IV. Pr�paration de l'environnement de d�veloppement VB▲
Cr�ez d'abord une nouvelle application Microsoft Office : Access, Excel, Word, ...
.
Ou cr�ez un nouveau projet Visual Basic 6.
Afin de pouvoir utiliser les fonctions OpengGL en VB :�� Importez le module standard ModOpenGL_1_1
Ce module contient les d�clarations des fonctions et constantes de OpenGL 1.1.�� Importez le module standard ModOpenGLTools
Ce module contient les d�clarations des fonctions et constantes de OpenGL 1.1 de Glu, ainsi que des fonctions sp�cifiques � Windows (wgl et gdi32).
Il contient �galement des fonctions suppl�mentaires utiles pour l'utisation d'openGL en VB.�� Importez le module standard ModOpenGLFreeGlut
Ce module contient toutes les d�clarations n�cessaires � freeglut.
Pour utiliser FreeGlut (cr�ation de fen�tres) :�� Placez la librarie freeglut.dll
dans le m�me r�pertoire que l'application Office ou le projet VB6.
Cette librairie a �t� compil�e avec Visual C++ Express 2008.
freeglut est sous licence : X-Consortium license.
Avec Office, pour ouvrir l'�diteur VBA, tapez ALT + F11.
Pour importer un module , choisissez dans le menu : Fichier => Importer un fichier ....
V. Premi�re fen�tre avec freeglut▲
Cr�ez un nouveau module standard (Insertion => Module dans Office).
Dans ce module nous ajoutons une fonction FonctionOpenGL dans laquelle nous �crirons le code de cr�ation de la fen�tre.
Function
FonctionOpenGL
(
)
End
Function
Pour VB6, cr�ez une proc�dure Main � la place de cette fonction.
Sub
Main
(
)
End
Sub
Notez qu'on a plac� la librairie freeglut.dll dans le m�me r�pertoire que l'application.
Pour appeler les fonctions de cette librairie, il faut donc d'abord la charger.
Si on avait plac� cette librairie dans le r�pertoire syst�me de Windows, il n'aurait pas �t� n�cessaire de la charger.
Pour charger la librairie, utilisons la fonction LoadLibrary (elle est d�clar�e dans le module ModFreeGlut).
'
Chargement
de
freeglut
If
LoadLibrary
(
CurrentProject.
Path
&
"
\freeglut.dll
"
) =
0
Then
MsgBox
"
Impossible
de
charger
la
librairie
freeglut
"
Exit
Function
End
If
Si le programme n'arrive pas � charger la librairie, la fonction renvoie 0 et on affiche alors un message d'erreur.
Remplacez CurrentProject en fonction de l'application utilis�e :
- CurrentProject pour Access.
- ThisWorkBook pour Excel.
- ThisDocument pour Word.
- App pour VB6.
On peut maintenant appeler les fonctions de freeglut.�� Premi�re �tape : l'initialisation :
'
Initialisation
de
la
librairie
glutInit 0
&
, "
"
D'apr�s la documention de glutInit, les param�tres de cette fonction d'initialisation sont utilis�s pour les syst�mes X Window.
Nous n'utilisons pas ces param�tres, on passe donc des valeurs vides.�� Deuxi�me �tape : l'initialisation du mode d'affichage :
'
Initialisation
du
mode
d'affichage
glutInitDisplayMode GLUT_RGBA Or
GLUT_DOUBLE Or
GLUT_DEPTH
- GLUT_RGBA signifie que la fen�tre utilise le mod�le de couleur RGB (rouge, vert, bleu) plus une composante alpha de transparence.
- GLUT_DOUBLE signifie que nous souhaitons utiliser un double buffer (nous le d�taillerons plus tard).
- GLUT_DEPTH signifie que nous souhaitons utiliser un tampon de profondeur (nous l'utiliserons �galement plus tard).�� Trois�me �tape : cr�ation d'une fen�tre :
'
Cr�ation
d'une
fen�tre
glutCreateWindow "
Tutoriel
fen�tre
GLUT
"
Le titre de la fen�tre est pass� en param�tre.
Cette fonction renvoie un num�ro de fen�tre (interne � freeglut) que l'on peut utiliser ensuite pour, par exemple, redimensionner, positionner ou d�truire la fen�tre.
Il est �galement possible de cr�er plusieurs fen�tres et de passer de l'une � l'autre.
Nous n'utiliserons pas ce num�ro.�� Quatri�me �tape : Ex�cution de la boucle principale :
Glut fonctionne avec une boucle principale qu'il est n�cessaire d'ex�cuter.
'
Boucle
principale
glutMainLoop
Cette boucle est sans fin, les instructions situ�es apr�s l'appel � cette fonction ne seront pas ex�cut�es tout de suite.
En VBA avec Office :
Si on ex�cute la fonction FonctionOpenGL (touche F5), on voit bien la fen�tre s'afficher mais si on la ferme toute l'application se ferme brutalement.
Pour �viter ce comportement, on d�finit une option de freeglut tr�s pratique :
Ajoutez cette instruction juste apr�s l'initialisation avec glutInitDisplayMode.
'
D�finition
de
l'option
de
sortie
de
boucle
glutSetOption GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS
Cette option demande � freeglut de continuer l'ex�cution apr�s l'instruction glutMainLoop au lieu d'arr�ter l'application.
On pourra alors si besoin fermer nous-m�mes l'application correctement.
Testons � nouveau notre programme, on peut fermer la fen�tre tout en conservant l'application ouverte.
Mais rien ne s'affiche dans la fen�tre, ou plut�t si : la fen�tre contient ce qui se situe dessous lors de son ouverture.
Pour l'instant c'est normal, on n'a pas encore g�r� l'affichage du contenu de notre fen�tre.�� Cinqui�me �tape : la fonction d'affichage :
On peut avec freeglut d�finir des fonctions de rappel (CallBack en anglais).
Ces fonctions sont ex�cut�es depuis freeglut au cours de la boucle que nous avons ex�cut�e avec glutMainLoop.
La liste des fonctions et de leur d�claration en VB est d�crite dans le chapitre suivant.
La fonction de rappel indispensable est la fonction d'affichage.
Cette fonction est appel�e � chaque fois qu'il est n�cessaire d'afficher le contenu de la fen�tre.
Cr�ez la fonction d'affichage dans le module VB :
'
Fonction
d'affichage
Public
Sub
CallBackDraw
(
)
End
Sub
Puis d�finissez la fonction dans freeglut, avant l'appel � glutMainLoop.
'
Fonction
d'affichage
glutDisplayFunc AddressOf CallBackDraw
Dans la fonction d'affichage on va :
- Vider les buffers avec glClear.
- R�aliser les op�rations de rendu (dessin d'obets, �clairage, ...), ce que nous ajouterons par la suite.
- Echanger les buffers pour afficher le r�sultat dans la fen�tre.
'
Fonction
d'affichage
Public
Sub
CallBackDraw
(
)
'
Vide
les
buffers
couleur
et
profondeur
glClear GL_COLOR_BUFFER_BIT Or
GL_DEPTH_BUFFER_BIT
'
Echange
les
buffers
glutSwapBuffers
End
Sub
Vous verrez sans doute dans diverses documentations un appel � glFlush qui demande � OpengGL d'ex�cuter les commandes en attente.
Nous n'appelons pas cette fonction ici, glutSwapBuffers le fait pour nous.
Notez �galement la fonction utilis�e : glutSwapBuffers et non pas SwapBuffers.
Voici le rappel du code complet de notre premi�re fen�tre GLUT :
Option
Explicit
Function
FonctionOpenGL
(
)
'
Chargement
de
freeglut
If
LoadLibrary
(
CurrentProject.
Path
&
"
\freeglut.dll
"
) =
0
Then
MsgBox
"
Impossible
de
charger
la
librairie
freeglut
"
Exit
Function
End
If
'
Initialisation
de
la
librairie
glutInit 0
&
, "
"
'
Initialisation
du
mode
d'affichage
glutInitDisplayMode GLUT_RGBA Or
GLUT_DOUBLE Or
GLUT_DEPTH
'
Cr�ation
d'une
fen�tre
glutCreateWindow "
Tutoriel
fen�tre
GLUT
"
'
D�finition
de
l'option
de
sortie
de
boucle
glutSetOption GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS
'
Fonction
d'affichage
glutDisplayFunc AddressOf CallBackDraw
'
Boucle
principale
glutMainLoop
End
Function
'
Fonction
d'affichage
Public
Sub
CallBackDraw
(
)
'
Vide
les
buffers
couleur
et
profondeur
glClear GL_COLOR_BUFFER_BIT Or
GL_DEPTH_BUFFER_BIT
'
Echange
les
buffers
glutSwapBuffers
End
Sub
Ex�cutez (F5) la fonction FonctionOpenGL pour afficher la fen�tre, qui est uniquement un fond noir pour l'instant.
- Notez que le buffer de couleurs est initialis� avec la couleur d�finie par glClearColor.
glClearColor 1, 0, 0, 1 par exemple d�finit une couleur de fond rouge.
- Le buffer de profondeur est vid� en donnant � chaque pixel une profondeur de 1.
Ceci peut �tre chang� avec la fonction glClearDepth.
VI. Les fonctions de rappel de freeglut▲
On peut avec freeglut d�finir des fonctions de rappel (CallBack en anglais).
Ces fonctions sont ex�cut�es depuis freeglut au cours de la boucle que nous avons ex�cut�e avec glutMainLoop.
Fonction freeglut | Description | D�claration VB |
---|---|---|
glutDisplayFunc AddressOf CallBackDraw | Appel�e lorsqu'un affichage de la fen�tre est n�cessaire. | Public Sub CallBackDraw() |
glutIdleFunc AddressOf CallBackIdle | Appel�e constamment lorsque le programme n'a pas d'�v�nements � traiter dans sa pile. | Public Sub CallBackIdle() |
glutReshapeFunc AddressOf CallBackReshape | Appel�e lorsque la fen�tre est redimensionn�e. | Public Sub CallBackReshape(ByVal width As Long, ByVal height As Long) |
glutKeyboardFunc AddressOf CallBackKeyBoard | Appel�e lorsqu'une touche est appuy�e. - char est le code ASCII du caract�re. - x et y sont les coordonn�es de la souris. |
Public Sub CallBackKeyBoard(ByVal char As Byte, ByVal x As Long, ByVal y As Long) |
glutKeyboardUpFunc AddressOf CallBackKeyBoardUp | Appel�e lorsqu'une touche est rel�ch�e. - char est le code ASCII du caract�re. - x et y sont les coordonn�es de la souris. |
Public Sub CallBackKeyBoardUp(ByVal char As Byte, ByVal x As Long, ByVal y As Long) |
glutCloseFunc AddressOf CallBackClose | Appel�e lorsque la fen�tre est ferm�e. | Public Sub CallBackClose() |
glutSpecialFunc AddressOf CallBackSpecial | Appel�e lorsqu'une touche sp�ciale est appuy�e. - key est le code de la touche. - x et y sont les coordonn�es de la souris. Retrouvez les valeurs possibles de key dans le module ModFreeGlut. Ce sont les constantes qui commencent par GLUT_KEY_ |
Public Sub CallBackSpecial(ByVal key As Long, ByVal x As Long, ByVal y As Long |
glutSpecialUpFunc AddressOf CallBackSpecialUp | Appel�e lorsqu'une touche sp�ciale est rel�ch�e. - key est le code de la touche. - x et y sont les coordonn�es de la souris. Retrouvez les valeurs possibles de key dans le module ModFreeGlut. Ce sont les constantes qui commencent par GLUT_KEY_ |
Public Sub CallBackSpecialUp(ByVal key As Long, ByVal x As Long, ByVal y As Long |
glutMouseFunc AddressOf CallBackMouse | Appel�e lorsqu'un bouton de la souris change d'�tat. - button est le code du bouton. - state est l'�tat du bouton. - x et y sont les coordonn�es de la souris. - button prend les valeurs : GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON ou GLUT_RIGHT_BUTTON. - state prend les valeurs : GLUT_DOWN ou GLUT_UP. |
Public Sub CallBackMouse(ByVal button As Long, ByVal state As Long, ByVal x As Long, ByVal y As Long) |
glutMouseWheelFunc AddressOf CallBackMouseWheel | Appel�e lorsqu'on d�place la molette de la souris. - wheel est le num�ro de la molette. - direction est la direction dans laquelle on l'a d�plac�e : -1 ou 1. - x et y sont les coordonn�es de la souris. |
Public Sub CallBackMouseWheel(ByVal wheel As Long, ByVal direction As Long, ByVal x As Long, ByVal y As Long) |
glutMotionFunc AddressOf CallBackMotion | Appel�e lorsqu'on d�place la souris avec un bouton appuy�. - x et y sont les coordonn�es de la souris. |
Public Sub CallBackMotion(ByVal x As Long, ByVal y As Long) |
glutPassiveMotionFunc AddressOf CallBackPassiveMotion | Appel�e lorsqu'on d�place la souris et qu'aucun bouton n'est appuy�. - x et y sont les coordonn�es de la souris. |
Public Sub CallBackPassiveMotion(ByVal x As Long, ByVal y As Long) |
glutJoystickFunc AddressOf CallBackJoystick, n | CallBackJoystick sera appel�e toutes les n millisecondes. - buttonMask contient les boutons appuy�s. - x, y et z la valeur de d�placement du joystick sur chacun de ces axes. |
Public Sub CallBackJoystick(ByVal buttonMask As Long, ByVal x As Long, ByVal y As Long, ByVal z As Long) |
glutTimerFunc n, AddressOf CallBackTimer, val | CallBackTimer sera appel�e n millisecondes plus tard. - val contient une valeur utilisateur. La fonction de rappel n'est appel�e qu'une seule fois. Il faut la relancer si on veut un timer en permanence. |
Public Sub CallBackTimer(ByVal val As Long) |