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

Les extensions OpenGL en VBA et VB6

Image non disponible

Les extensions OpenGL en VBA et VB6

Image non disponible


prcdentsommairesuivant

VIII. Les Shaders


Les Shaders sont de petits programmes excuts par la carte graphique.
Ils sont trs efficaces et permettent de programmer de nombreux effets trs rapides.
Ces programmes sont crits en langage GLSL, abrviation de OpenGL Shading Language.
Ce langage est proche du C, vous en trouverez les spcifications sur le site d'OpenGL : OpenGL Shading Language

Nous n'allons pas dtailler ici le langage GLSL : nous allons "juste" apprendre intgrer ces programmes dans notre application en VB.

VIII-A. Prparation de l'environnement de dveloppement VB


Prparez votre application pour afficher un cube, tel qu'il est expliqu ci-dessus dans la section V : Prparation de l'environnement de dveloppement VB.

Les Shaders sont apparus avec la version 2.0, ils sont supports pas les cartes graphiques rcentes mais pas par certaines cartes graphiques des PC bureautiques.

Commenons par vrifier que la carte graphique les supporte, en plaant ce code avant l'appel InitScene :

Teste le support des textures 3D
Sélectionnez

' Teste si les Shaders sont supports
If val(LongToString(glGetString(GL_VERSION))) < 2 Then
    MsgBox "Shaders non supports", vbOKOnly
    Exit Function 
End If


Bien entendu, Exit Function est remplacer par Exit Sub si le test est cod dans la procdure Main d'une application VB6.
Si les Shaders ne sont pas supports, on affiche un message et on quitte la fonction.

Importez maintenant le module ModOpenGL_2_0 qui contient les fonctions de la version 2.0.
N'oubliez pas de "mapper" ensuite les fonctions en excutant la procdure RemapVBToGL de ce module.

Initialisation des fonctions
Sélectionnez

' Initialise les fonctions
ModOpenGL_2_0.RemapVBToGL


Nous voici prts programmer les Shaders!

VIII-B. Shader et Program


Il y a deux notions connatre :
- les Shaders.
- et les Programs.

Le principe est assez simple :
1 - on cre un Shader.
2 - on dfinit son code source en GLSL.
3 - on compile le Shader
4 - on cre un Program.
5 - on attache le Shader au Program.
6 - on gnre le Program excutable (tape de linkage).
7 - on peut utiliser le Program.

On pourra activer ou dsactiver un Program au cours du rendu.

La complication en VB est la gestion des chanes de caractres.
OpenGL utilise des chanes de caractres multi-octets alors que VB utilise des chanes Unicode.
Nous utiliserons donc la fonction StrConv pour convertir les chanes de caractres.
De plus les paramtres sont des pointeurs, que nous obtenons avec la fonction StrPtr ou VarPtr selon les cas.

VIII-C. Les types de Shaders


Il y a trois types de Shaders :
- les Shaders de sommets (Vertex Shaders) qui agissent sur la position des Vertex.
- les Shaders de pixels (Fragement Shaders) qui agissent sur la couleur des pixels de l'image.
- les Shaders de gomtrie (Geometry Shaders) apparus avec le Shader Model 4.0 d'OpenGL 3.

VIII-D. Mon premier Shader


Pour dbuter, nous allons crer et utiliser un Shader trs simple.
Celui-ci modifie la couleur de chaque pixel afin qu'il soit rouge.
Ce programme n'est pas trs utile mais a le mrite d'tre simple pour un premier exemple.

Voici le code GLSL de ce Shader :

Code du Shader
Sélectionnez

void main(void)
{
gl_FragColor = vec4 ( 1.0 , 0.0 , 0.0 , 1.0 ) ;
}


Il est en effet trs simple :
- pour chaque pixel dessin, la procdure main est appele.
- gl_FragColor renvoit une couleur fixe (couleur rouge).

Voyons maintenant comment intgrer ce programme dans notre code VB.

VIII-E. Gnration du programme excutable par la carte graphique


Dans la procdure InitScene, gnrons un Shader.


Gnration du Shader
Sélectionnez

'Gnration du Shader
Dim lShader As Long
lShader = glCreateShader(GL_FRAGMENT_SHADER)


GL_FRAGMENT_SHADER dsigne un Shader de pixel, car nous souhaitons agir sur la couleur des pixels.

Ensuite il faut dfinir le code source du Shader grce la fonction glShaderSource.
Nous crivons ce code dans une variable lShaderString de type String.
Il est galement possible d'crire le code source dans un fichier texte et de le charger en VB.
On peut ainsi crire des Shaders facilement rutilisables.

Code source du Shader
Sélectionnez

' Code source du Shader
Dim lShaderString As String	
lShaderString = "void main(void)" & _
                "{" & _
                "gl_FragColor = vec4 ( 1.0 , 0.0 , 0.0 , 1.0 ) ;" & _
                "}"		


Ce code source doit tre converti en multi-octets :

Code source du Shader
Sélectionnez

' Conversion
lShaderString = StrConv(lShaderString, vbFromUnicode)


Puis on injecte le code source dans le Shader :

Injecte le code source dans le Shader
Sélectionnez

' Injecte le code source dans le Shader
glShaderSource lShader, 1, VarPtr(lShaderString), LenB(lShaderString)


On passe en paramtre le pointeur vers la chane de caractres : on obtient ce pointeur grce la fonction VarPtr.
Et en dernier paramtre, on prcise la taille de la chane de caractres : il est important d'utiliser la fonction LenB.

Notez le deuxime paramtre gal 1 :
Ce paramtre prcise le nombre de chanes de caractres qui sont passes dans le troisime paramtre.
Ici on n'a qu'une seule chane de caractres.
Pour prciser plusieurs chanes, il faut les stocker dans un tableau.
On donne alors :
- en deuxime paramtre le nombre de lignes dans ce tableau.
- en troisime paramtre un pointeur vers le premier lment de ce tableau.
- et en quatrime paramtre un pointeur vers le premier lment d'un tableau contenant les tailles de chaque chane de caractres.

Il faut maintenant compiler le Shader :

Compile le Shader
Sélectionnez

' Compile le Shader
glCompileShader lShader


Cette compilation est effectue par la carte graphique.
On peut ensuite lire le statut de la compilation :

Statut de compilation
Sélectionnez

' Lecture du status de compilation
Dim lStatus As Long
glGetShaderiv lShader, GL_COMPILE_STATUS, lStatus


Si lStatus contient GL_TRUE, alors la compilation s'est correctement droule.
Dans le cas contraire il est possible de lire le journal de compilation :

Journal de compilation
Sélectionnez

If lStatus <> GL_TRUE Then
    ' Taille du journal
    glGetShaderiv lShader, GL_INFO_LOG_LENGTH, lSize
    ' Lecture du journal
    lLog = Space(lSize)
    glGetShaderInfoLog lShader, lSize, lSize, StrPtr(lLog)
    ' Ecriture du journal dans la fentre de dbogage
    Debug.Print StrConv(lLog, vbUnicode)
End If


La lecture de ce journal se fait en deux temps :
1 - il faut d'abord lire la taille du journal.
2 - ensuite on lit le journal en spcifiant sa taille.

La chane de caractres qui reoit le journal doit tre d'une taille suffisante, on initialise donc la variable lLog avec autant d'espaces que la taille du journal.
Puis la fonction glGetShaderInfoLog demande un pointeur vers cette variable ; on utilise ici encore la fonction StrPtr.
Finalement, on crit le journal en prenant soin de convertir la variable au format Unicode.

Pour tester ce journal de compilation, modifiez le code source de manire gnrer une erreur.

Par contre si la compilation s'est correctement droule, on continue le traitement en gnrant le programme.

On utilise un identifant de programme dclar en en-tte de module :

Identifiant du programme
Sélectionnez

' Identifiant du programme
Private gProgram As Long


Puis on gnre le programme la suite du code prcdent :

Gnre le Program
Sélectionnez

Else
    ' Gnre un identifiant de programme
    gProgram = glCreateProgram
    ' Attache le shader au programme
    glAttachShader gProgram, lShader
    ' Gnre le programme excutable
    glLinkProgram gProgram
    ' Statut du liage
    glGetProgramiv gProgram, GL_LINK_STATUS, lStatus
    If lStatus <> GL_TRUE Then
        ' Taille du journal
        glGetProgramiv lShader, GL_INFO_LOG_LENGTH, lSize
        ' Lecture du journal
        lLog = Space(lSize)
        glGetProgramInfoLog lShader, lSize, lSize, StrPtr(lLog)
        ' Ecriture du journal dans la fentre de dbogage
        Debug.Print StrConv(lLog, vbUnicode)
    End If
    ' Supprime le shader
    glDeleteShader lShader
End If


glLinkProgram peut galement provoquer une erreur : on rcupre alors le journal de la mme manire que pour la compilation du Shader.

C'est seulement lorsque cette tape de lien s'est correctement droule que le Program est utilisable.
On peut alors supprimer le Shader qui n'est plus utile (glDeleteShader).

VIII-F. Utilisation du programme


Il est maintenant trs simple d'utiliser le programme.
Il suffit d'appeler la fonction glUseProgram afin de dfinir l'utilisation du programme.

Avant le dessin du cube, activez le programme :

Active le programme
Sélectionnez

' Active le programme
glUseProgram gProgram


Et aprs le dessin du cube, dsactivez-le :

Dsactive le programme
Sélectionnez

' Dsactive le programme
glUseProgram 0&


Excutez l'application : le cube est color en rouge.

Image non disponible

Cet effet n'est pas spectaculaire, mais en utilisant des shaders plus complexes on peut mettre en oeuvre des effets comme ceux qu'on voit souvent dans les jeux vido.

VIII-G. Tlchargement


Les Shaders

Image non disponible Access
Image non disponible VB6


prcdentsommairesuivant

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.