Dcouvrez OpenGL 1.1 en VB6/VBA

Image non disponible


prcdentsommairesuivant

I. Introduction

Au cours de ce tutoriel, nous allons dcouvrir la programmation de la 3D avec OpenGL.
Cette dcouverte va se faire en langage VBA ou VB6.
Cependant, les fonctions et techniques utilises sont les mmes dans tous les langages.

Pour simplifier, lorsque j'emploie le terme VB, il rfre VB6 ou VBA

II. Librairies utilises

Tout d'abord OpenGL est install avec Windows.
Il y a deux librairies pour OpenGL dans le rpertoire systme de Windows :
- opengl32.dll : c'est la librairie principale
- glu32.dll = GL Utility : c'est un complment qui contient quelques autres fonctions utiles

OpenGL ne gre pas le fentrage : c'est--dire qu'il faut fournir OpenGL une fentre sur laquelle il va effectuer le rendu de l'image.
De plus il ne gre pas les entres clavier, souris, ...

Pour grer l'affichage des fentres et des vnements divers (clavier, souris, minuterie, ...), il existe plusieurs librairies.
Glut est une librairie trs largement utilise.
Mais pour une utilisation en VB, je lui ai prfr freeglut qui expose des fonctions similaires, et quelques nouveauts 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 dclarer chacune d'entre-elles dans VB.
Nous allons donc prparer notre environnement de dveloppement.

III. Le pack de module VB pour OpenGL

Image non disponible Tous les modules VB ncessaires l'utilisation d'OpenGL sont regroups dans une archive compresse au format zip.

Tlchargez cette archive :
Pack de module VB pour OpengGL

Image non disponible Pour utiliser FreeGlut, tlchargez galement la librairie dll :
Librairie FreeGlut

IV. Prparation de l'environnement de dveloppement VB

Crez d'abord une nouvelle application Microsoft Office : Access, Excel, Word, ...
. Ou crez 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 dclarations des fonctions et constantes de OpenGL 1.1.

Image non disponible Importez le module standard ModOpenGLTools
Ce module contient les dclarations des fonctions et constantes de OpenGL 1.1 de Glu, ainsi que des fonctions spcifiques Windows (wgl et gdi32).
Il contient galement des fonctions supplmentaires utiles pour l'utisation d'openGL en VB.

Image non disponible Importez le module standard ModOpenGLFreeGlut
Ce module contient toutes les dclarations ncessaires freeglut.

Pour utiliser FreeGlut (cration de fentres) :

Image non disponible Placez la librarie freeglut.dll dans le mme rpertoire que l'application Office ou le projet VB6.

Cette librairie a t compile 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. Premire fentre avec freeglut

Crez un nouveau module standard (Insertion => Module dans Office).
Dans ce module nous ajoutons une fonction FonctionOpenGL dans laquelle nous crirons le code de cration de la fentre.

Fonction FonctionOpenGL
Sélectionnez

Function FonctionOpenGL()

End Function


Pour VB6, crez une procdure Main la place de cette fonction.

Procdure d'entre VB6
Sélectionnez

Sub Main()

End Sub


Notez qu'on a plac la librairie freeglut.dll dans le mme rpertoire 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 rpertoire systme de Windows, il n'aurait pas t ncessaire de la charger.


Pour charger la librairie, utilisons la fonction LoadLibrary (elle est dclare 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 utilise :
- CurrentProject pour Access.
- ThisWorkBook pour Excel.
- ThisDocument pour Word.
- App pour VB6.

On peut maintenant appeler les fonctions de freeglut.

Image non disponible Premire tape : l'initialisation :

Initialisation de la librarie freeglut
Sélectionnez

' Initialisation de la librairie
glutInit 0&, ""


D'aprs la documention de glutInit, les paramtres de cette fonction d'initialisation sont utiliss pour les systmes X Window.
Nous n'utilisons pas ces paramtres, on passe donc des valeurs vides.

Image non disponible Deuxime 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 fentre utilise le modle de couleur RGB (rouge, vert, bleu) plus une composante alpha de transparence.
- GLUT_DOUBLE signifie que nous souhaitons utiliser un double buffer (nous le dtaillerons plus tard).
- GLUT_DEPTH signifie que nous souhaitons utiliser un tampon de profondeur (nous l'utiliserons galement plus tard).

Image non disponible Troisme tape : cration d'une fentre :

Cration d'une fentre
Sélectionnez

' Cration d'une fentre
glutCreateWindow "Tutoriel fentre GLUT"


Le titre de la fentre est pass en paramtre.
Cette fonction renvoie un numro de fentre (interne freeglut) que l'on peut utiliser ensuite pour, par exemple, redimensionner, positionner ou dtruire la fentre.
Il est galement possible de crer plusieurs fentres et de passer de l'une l'autre.
Nous n'utiliserons pas ce numro.


Image non disponible Quatrime tape : Excution de la boucle principale :

Glut fonctionne avec une boucle principale qu'il est ncessaire d'excuter.

Excution de la boucle principale
Sélectionnez

' Boucle principale
glutMainLoop


Cette boucle est sans fin, les instructions situes aprs l'appel cette fonction ne seront pas excutes tout de suite.

En VBA avec Office :
Si on excute la fonction FonctionOpenGL (touche F5), on voit bien la fentre s'afficher mais si on la ferme toute l'application se ferme brutalement.

Pour viter ce comportement, on dfinit une option de freeglut trs pratique :

Ajoutez cette instruction juste aprs l'initialisation avec glutInitDisplayMode.

Dfinition de l'option de sortie de boucle
Sélectionnez

' Dfinition de l'option de sortie de boucle
glutSetOption GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS


Cette option demande freeglut de continuer l'excution aprs l'instruction glutMainLoop au lieu d'arrter l'application.
On pourra alors si besoin fermer nous-mmes l'application correctement.

Testons nouveau notre programme, on peut fermer la fentre tout en conservant l'application ouverte.

Mais rien ne s'affiche dans la fentre, ou plutt si : la fentre contient ce qui se situe dessous lors de son ouverture.
Pour l'instant c'est normal, on n'a pas encore gr l'affichage du contenu de notre fentre.


Image non disponible Cinquime tape : la fonction d'affichage :

On peut avec freeglut dfinir des fonctions de rappel (CallBack en anglais).
Ces fonctions sont excutes depuis freeglut au cours de la boucle que nous avons excute avec glutMainLoop.
La liste des fonctions et de leur dclaration en VB est dcrite dans le chapitre suivant.

La fonction de rappel indispensable est la fonction d'affichage.
Cette fonction est appele chaque fois qu'il est ncessaire d'afficher le contenu de la fentre.

Crez la fonction d'affichage dans le module VB :

Cration de la fonction d'affichage
Sélectionnez

' Fonction d'affichage
Public Sub CallBackDraw()

End Sub


Puis dfinissez la fonction dans freeglut, avant l'appel glutMainLoop.

Dfinition 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.
- Raliser les oprations de rendu (dessin d'obets, clairage, ...), ce que nous ajouterons par la suite.
- Echanger les buffers pour afficher le rsultat dans la fentre.

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'excuter les commandes en attente.
Nous n'appelons pas cette fonction ici, glutSwapBuffers le fait pour nous.

Notez galement la fonction utilise : glutSwapBuffers et non pas SwapBuffers.

Voici le rappel du code complet de notre premire fentre GLUT :

Module de base pour cration fentre 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
' Cration d'une fentre
glutCreateWindow "Tutoriel fentre GLUT"
' Dfinition 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


Excutez (F5) la fonction FonctionOpenGL pour afficher la fentre, qui est uniquement un fond noir pour l'instant.

Image non disponible

- Notez que le buffer de couleurs est initialis avec la couleur dfinie par glClearColor.
glClearColor 1, 0, 0, 1 par exemple dfinit 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 dfinir des fonctions de rappel (CallBack en anglais).
Ces fonctions sont excutes depuis freeglut au cours de la boucle que nous avons excute avec glutMainLoop.

Fonction freeglut Description Dclaration VB
glutDisplayFunc AddressOf CallBackDraw Appele lorsqu'un affichage de la fentre est ncessaire. Public Sub CallBackDraw()
glutIdleFunc AddressOf CallBackIdle Appele constamment lorsque le programme n'a pas d'vnements traiter dans sa pile. Public Sub CallBackIdle()
glutReshapeFunc AddressOf CallBackReshape Appele lorsque la fentre est redimensionne. Public Sub CallBackReshape(ByVal width As Long, ByVal height As Long)
glutKeyboardFunc AddressOf CallBackKeyBoard Appele lorsqu'une touche est appuye.
- char est le code ASCII du caractre.
- x et y sont les coordonnes de la souris.
Public Sub CallBackKeyBoard(ByVal char As Byte, ByVal x As Long, ByVal y As Long)
glutKeyboardUpFunc AddressOf CallBackKeyBoardUp Appele lorsqu'une touche est relche.
- char est le code ASCII du caractre.
- x et y sont les coordonnes de la souris.
Public Sub CallBackKeyBoardUp(ByVal char As Byte, ByVal x As Long, ByVal y As Long)
glutCloseFunc AddressOf CallBackClose Appele lorsque la fentre est ferme. Public Sub CallBackClose()
glutSpecialFunc AddressOf CallBackSpecial Appele lorsqu'une touche spciale est appuye.
- key est le code de la touche.
- x et y sont les coordonnes 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 Appele lorsqu'une touche spciale est relche.
- key est le code de la touche.
- x et y sont les coordonnes 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 Appele 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 coordonnes 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 Appele lorsqu'on dplace la molette de la souris.
- wheel est le numro de la molette.
- direction est la direction dans laquelle on l'a dplace : -1 ou 1.
- x et y sont les coordonnes 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 Appele lorsqu'on dplace la souris avec un bouton appuy.
- x et y sont les coordonnes de la souris.
Public Sub CallBackMotion(ByVal x As Long, ByVal y As Long)
glutPassiveMotionFunc AddressOf CallBackPassiveMotion Appele lorsqu'on dplace la souris et qu'aucun bouton n'est appuy.
- x et y sont les coordonnes de la souris.
Public Sub CallBackPassiveMotion(ByVal x As Long, ByVal y As Long)
glutJoystickFunc AddressOf CallBackJoystick, n CallBackJoystick sera appele toutes les n millisecondes.
- buttonMask contient les boutons appuys.
- x, y et z la valeur de dplacement 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 appele n millisecondes plus tard.
- val contient une valeur utilisateur.

La fonction de rappel n'est appele qu'une seule fois.
Il faut la relancer si on veut un timer en permanence.
Public Sub CallBackTimer(ByVal val As Long)

prcdentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Thierry GASPERMENT. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.