IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Découvrez OpenGL 1.1 en VB6/VBA

Image non disponible

D�couvrez OpenGL 1.1 en VB6/VBA

Image non disponible


pr�c�dentsommairesuivant

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

Image non disponible�� 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

Image non disponible�� 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 :

Image non disponible�� Importez le module standard ModOpenGL_1_1
Ce module contient les d�clarations des fonctions et constantes de OpenGL 1.1.

Image non disponible�� 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.

Image non disponible�� Importez le module standard ModOpenGLFreeGlut
Ce module contient toutes les d�clarations n�cessaires � freeglut.

Pour utiliser FreeGlut (cr�ation de fen�tres) :

Image non disponible�� 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.

Fonction FonctionOpenGL
Sélectionnez

Function FonctionOpenGL()

End Function


Pour VB6, cr�ez une proc�dure Main � la place de cette fonction.

Proc�dure d'entr�e VB6
Sélectionnez

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 la librarie freeglut
Sélectionnez

' 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.

Image non disponible�� Premi�re �tape : l'initialisation :

Initialisation de la librarie freeglut
Sélectionnez

' 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.

Image non disponible�� Deuxi�me �tape : l'initialisation du mode d'affichage :

Initialisation du mode d'affichage
Sélectionnez

' 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).

Image non disponible�� Trois�me �tape : cr�ation d'une fen�tre :

Cr�ation d'une fen�tre
Sélectionnez

' 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.


Image non disponible�� Quatri�me �tape : Ex�cution de la boucle principale :

Glut fonctionne avec une boucle principale qu'il est n�cessaire d'ex�cuter.

Ex�cution de la boucle principale
Sélectionnez

' 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
Sélectionnez

' 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.


Image non disponible�� 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 :

Cr�ation de la fonction d'affichage
Sélectionnez

' Fonction d'affichage
Public Sub CallBackDraw()

End Sub


Puis d�finissez la fonction dans freeglut, avant l'appel � glutMainLoop.

D�finition de la fonction d'affichage
Sélectionnez

' 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.

Contenu de la fonction d'affichage
Sélectionnez

' 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 :

Module de base pour cr�ation fen�tre GLUT
Sélectionnez

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.

Image non disponible

- 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)

pr�c�dentsommairesuivant