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.
dim
lVersion as
String
lVersion =
LongToString
(
glGetString
(
GL_VERSION))
If
val
(
lVersion) <
1
.5
then
MsgBox
"Version 1.5 non supportée!"
End
If
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 :
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é :
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.