Les extensions OpenGL en VBA et VB6

Image non disponible


précédentsommairesuivant

I. Introduction

Au cours du tutoriel précédent, nous avons découvert la programmation en 3D avec OpenGL.

Dans ce nouvel article, nous allons apprendre à utiliser les extensions d'OpenGL en VB.

II. Les extensions

La bibliothèque OpenGL livrée avec Windows ne contient que les fonctions de la version 1.1.
Les fonctions des versions suivantes sont accessibles sous forme d'extensions.

Vous trouverez, en plus des différentes versions, des extensions :

  • en cours de validation (EXT) ;
  • validées pour une future version (ARB) ;
  • spécifiques à un matériel (NV, IBM, ATI…).

Ces extensions sont regroupées dans les différents modules du Pack de module VB pour OpenGL:

Module Extensions
ModOpenGL_1_2 à ModOpenGL_4_6 Versions 1.2 à 4.6.
ModOpenGL_ARB Extensions ARB, validée.
ModOpenGL_EXT Extensions EXT, en attente de validation.
ModOpenGL_OTHER Extensions spécifiques : ATI, IBM, NVIDIA…
ModOpenGL_WGL Extensions WGL spécifiques à Windows

Afin de pouvoir utiliser ces modules, il faut, avant toute chose, redéfinir les fonctions pour qu'elles pointent vers les fonctions d'extensions.

Pour ce faire, dans chacun de ces modules, vous trouverez une fonction RemapVBToGL.
Cette fonction doit être exécutée après la création d'un contexte OpenGL.

Par exemple pour utiliser les fonctions des Vertex Buffer Objects (VBO) de la version 1.5 :

  • importez le module ModOpenGL_1_5 ;
  • après l'initialisation de freeGLUT, appelez la fonction ModOpenGL_1_5.RemapVBToGL.

Les fonctions du module ModOpenGL_1_5 (par exemple glBindBuffer) peuvent ensuite être utilisées.

Les déclarations de ces fonctions d'extensions ont été traduites en VB à partir des fichiers d'en-tête de Glew, écrits en langage C++.

Toutes les fonctions n'ont pas été testées.

III. glBindBuffer ou glBindBufferARB ?

Vous pouvez trouver certaines fonctions avec le suffixe ARB ou EXT, et également la même fonction sans suffixe.

Par exemple :

  • glBindBuffer est présente dans la version 1.5, module ModOpenGL_1_5 ;
  • glBindBufferARB est présente dans les extensions ARB, module ModOpenGL_ARB.

En fonction du driver de la carte graphique, l'une ou l'autre des deux fonctions peut être supportée :

  • la fonction glBindBuffer si le driver est compatible avec la version 1.5 ;
  • la fonction glBindBufferARB si le driver est compatible avec l'extension GL_ARB_vertex_buffer_object (mais pas forcément avec la version 1.5).

Utilisez de préférence la fonction sans suffixe.
Si celle-ci n'est pas supportée, la fonction RemapVBToGL recherchera automatiquement la fonction avec un suffixe ARB ou EXT.

Ainsi un programme qui utilise la fonction glBindBuffer fonctionnera sur les cartes compatibles avec la version 1.5, et également avec les cartes compatibles avec l'extension GL_ARB_vertex_buffer_object.

IV. Vérifier la compatibilité de la carte graphique

Toutes les cartes graphiques (ou plutôt leur pilote) ne sont pas compatibles avec toutes les extensions et versions.

Pour vérifier la version d'OpenGL supportée, utilisez la fonction glGetString avec le paramètre GL_VERSION.

Pour vérifier les extensions supportées, utilisez la fonction glGetString avec le paramètre GL_EXTENSIONS.

La fonction glGetString renvoie un entier de type Long (ou LongPtr) qui est un pointeur vers une chaîne de caractères.

Pour obtenir la chaîne de caractères, utilisez la fonction LongToString du module ModOpenGLTools.

Exemple : tester si la version d'OpenGL est au moins égale à 1.5
Sélectionnez
dim lVersion as String
lVersion = LongToString(glGetString(GL_VERSION))
If val(lVersion) < 1.5 then
	MsgBox "Version 1.5 non supportée!"
End If
Exemple : tester si l'extension GL_ARB_vertex_buffer_object est supportée
Sélectionnez
dim lExtensions as String
lExtensions = LongToString(glGetString(GL_EXTENSIONS))
If InStr(lExtensions,"GL_ARB_vertex_buffer_object") = 0 then
	MsgBox "VBO non supportés!"
End If

Il est également possible de tester directement le support d'une fonction en recherchant l'adresse mémoire de la fonction. Celle-ci est égale à zéro si la fonction n'est pas supportée :

Exemple : tester le support de la fonction glBindBuffer
Sélectionnez
If wglGetProcAddress("glBindBuffer") = 0 Then
    MsgBox "glBindBuffer non supporté!"
End If

V. Préparation de l'environnement de développement VB

Référez-vous au premier tutoriel pour télécharger les modules nécessaires et créer une fenêtre Glut.

Vous devez importer les modules ModOpenGLTools, ModOpenGLFreeGlut, ModOpenGL_1_1.
Ces modules sont dans le Pack de module VB pour OpenGL.

Vous devez également copier la librairie FreeGlut au côté de votre application.

Voici pour rappel le code pour une fenêtre GLUT qui affiche un cube coloré :

Rappel du code d'affichage d'un cube
Sélectionnez
Option Explicit

' Temps écoulé pour calcul du frame rate
Private gElapsedTime As Long
' Nombre d'affichages pour calcul du frame rate
Private gDisplayCount As Long
' RotationX
Private gRotateX As Double
' RotationY
Private gRotateY As Double
' Zoom
Private gZoom As Double

' Fonction principale
Function FonctionOpenGL()
' Chargement de freeglut
If Not LoadFreeGlut(CurrentProject.Path) Then
    MsgBox "Impossible de charger la bibliothèque freeglut"
    Exit Function
End If
' Initialisation de la bibliothèque
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
' Fonctions de rappel clavier
glutSpecialFunc AddressOf CallBackSpecial
' Fonction de rappel molette de souris
glutMouseWheelFunc AddressOf CallBackMouseWheel
' Appel de la fonction d'initialisation
InitScene
' Fonction d'attente
glutTimerFunc 1000 / 50, AddressOf CallBackTimer, 0
' Boucle principale
glutMainLoop
End Function

' Fonction d'affichage
Public Sub CallBackDraw()
' Appel de la fonction de rendu
Call Render
' Echange les buffers
glutSwapBuffers
' Calcul et affichage du frame rate
gDisplayCount = gDisplayCount + 1
If gDisplayCount = 100 Then
    'glutSetWindowTitle "Frame rate : " & format(gDisplayCount / (glutGet(GLUT_ELAPSED_TIME) - gElapsedTime) * 1000, "0,0")
    gDisplayCount = 0
    gElapsedTime = glutGet(GLUT_ELAPSED_TIME)
End If
End Sub

' Fonction d'attente
Public Sub CallBackTimer(ByVal value As Long)
' Rappel de la fonction d'attente
glutTimerFunc 1000 / 50, AddressOf CallBackTimer, 0
' Rafraichir l'affichage si une fenêtre openGL est active
If glutGetWindow <> 0 Then glutPostRedisplay
End Sub

' Gestion du clavier
Public Sub CallBackSpecial(ByVal key As Long, ByVal X As Long, ByVal y As Long)
Select Case key
    Case GLUT_KEY_LEFT
        gRotateY = gRotateY - 10
    Case GLUT_KEY_RIGHT
        gRotateY = gRotateY + 10
    Case GLUT_KEY_UP
        gRotateX = gRotateX - 10
    Case GLUT_KEY_DOWN
        gRotateX = gRotateX + 10
End Select
End Sub

' Gestion de la molette de la souris
Public Sub CallBackMouseWheel(ByVal wheel As Long, ByVal direction As Long, ByVal X As Long, ByVal y As Long)
gZoom = gZoom + direction
End Sub

' Initialisation de la scène
Public Sub InitScene()
' Tests de profondeur
glEnable GL_DEPTH_TEST
glDepthFunc GL_LEQUAL
' Initialisation des variables de visualisation
gRotateX = 0
gRotateY = 0
gZoom = 10
End Sub

' Rendu de la scène
Public Sub Render()
' Passage en matrice de projection
glMatrixMode GL_PROJECTION
' Initialisation de la matrice
glLoadIdentity
' Définition de la perspective
gluPerspective 45, 1, 0.1, 100
' Passage en matrice de modélisation-visualisation
glMatrixMode GL_MODELVIEW
' Initialisation de la matrice
glLoadIdentity
' Position de la caméra
gluLookAt 0, 0, gZoom, 0, 0, 0, 0, 1, 0
glRotated gRotateX, 1, 0, 0
glRotated gRotateY, 0, 1, 0
' Vide les buffers couleur et profondeur
glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT
' Sauvegarde la matrice
glPushMatrix
' Rotation du cube
glRotated 30, 1, 1, 1
' Début de la primitive pour le cube
glBegin GL_QUADS
    ' Face du haut = vert
    Call glColor3d(0, 1, 0)
    Call glVertex3d(1, 1, -1)
    Call glVertex3d(-1, 1, -1)
    Call glVertex3d(-1, 1, 1)
    Call glVertex3d(1, 1, 1)
    ' Face du bas = orange
    Call glColor3d(1, 0.5, 0)
    Call glVertex3f(-1, -1, -1)
    Call glVertex3f(1, -1, -1)
    Call glVertex3f(1, -1, 1)
    Call glVertex3f(-1, -1, 1)
    ' Face de derrière = rouge
    Call glColor3d(1, 0, 0)
    Call glVertex3f(1, -1, -1)
    Call glVertex3f(-1, -1, -1)
    Call glVertex3f(-1, 1, -1)
    Call glVertex3f(1, 1, -1)
    ' Face de devant = jaune
    Call glColor3d(1, 1, 0)
    Call glVertex3f(-1, -1, 1)
    Call glVertex3f(1, -1, 1)
    Call glVertex3f(1, 1, 1)
    Call glVertex3f(-1, 1, 1)
    ' Face de gauche = violet
    Call glColor3d(1, 0, 1)
    Call glVertex3f(-1, 1, 1)
    Call glVertex3f(-1, 1, -1)
    Call glVertex3f(-1, -1, -1)
    Call glVertex3f(-1, -1, 1)
    ' Face de droite = bleu
    Call glColor3d(0, 0, 1)
    Call glVertex3f(1, 1, -1)
    Call glVertex3f(1, 1, 1)
    Call glVertex3f(1, -1, 1)
    Call glVertex3f(1, -1, -1)
glEnd
' Restaure la matrice
glPopMatrix
End Sub

Exécutez (F5) la fonction FonctionOpenGL (ou exécutez le projet sous VB6) pour afficher la fenêtre.

Utilisez :

  • les touches fléchées pour faire tourner la scène ;
  • la molette de la souris pour zoomer la scène.

Remplacez CurrentProject en fonction de l'application utilisée :

  • CurrentProject pour Access ;
  • ThisWorkBook pour Excel ;
  • ThisDocument pour Word ;
  • App pour VB6.

Pour VB6, remplacez également Function FonctionOpenGL par le point d'entrée Sub Main.


précédentsommairesuivant

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 © 2009 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.