I. Introduction▲
Au cours du tutoriel précédent, nous avons découvert la programmation de la 3D avec OpenGL.
Dans ce nouvel article, nous allons apprendre à utiliser les extensions d'OpenGL en VB.
II. Les extensions▲
La librairie 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 | Version 1.2 |
ModOpenGL_1_3 | Version 1.3 |
ModOpenGL_1_4 | Version 1.4 |
ModOpenGL_1_5 | Version 1.5 |
ModOpenGL_2_0 | Version 2.0 |
ModOpenGL_2_1 | Version 2.1 |
ModOpenGL_3_0 | Version 3.0 |
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 tout 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 long 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
à
attendre
pour
le
prochaine
affichage
Private
gWaitTime As
Long
'
Temps
écoulé
pour
calcul
du
frame
rate
Private
gElapsedTime As
Long
'
Nombre
d'affichage
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
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
'
Fonction
d'attente
glutIdleFunc AddressOf CallBackIdle
'
Fonctions
de
rappel
clavier
glutSpecialFunc AddressOf CallBackSpecial
'
Fonction
de
rappel
molette
de
souris
glutMouseWheelFunc AddressOf CallBackMouseWheel
'
Appel
de
la
fonction
d'initialisation
InitScene
'
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
'
Procédure
de
rappel
attente
Public
Sub
CallBackIdle
(
)
Dim
lTimer As
Long
'
Temps
présent
lTimer =
glutGet
(
GLUT_ELAPSED_TIME)
'
Si
temps
présent
>=
au
temps
attendu
If
lTimer >=
gWaitTime Then
'
Rrafraichir
l'affichage
glutPostRedisplay
'
n
affichages
par
seconde
gWaitTime =
lTimer +
(
1000
/
50
)
End
If
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
(
)
'
Initialisation
du
temps
déclencheur
de
l'affichage
gWaitTime =
glutGet
(
GLUT_ELAPSED_TIME)
'
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.