Dans mon dernier article, j'avais parlé des cartes 3Dfx et de leurs bonnes capacités
à fournir une accellération matériel pour Mesa. J'ai abordé les avantages et les inconvénients
de l'utilisation de Mesa+3Dfx, et aujourd'hui, je voudrais insister sur les inconvénients et
comment le développeur peut les contourner.
Pour commencer, l'article informatif de Miguel explique
comment utiliser la bibliothèque GLUT pour tracer dans des fenêtres filles (sous-fenêtres) incluses dans la
fenêtre principale. En utilisant des sous-fenêtres, un nouveau contexte est créé séparément
de celui de la fenêtre principale. Malheureusement, le pilote 3Dfx pour Mesa ne supporte qu'un
contexte pour l'instant. Si vous essayez d'utiliser des sous-fenêtres avec une 3Dfx, vous
constaterez qu'au lieu de se tracer dans la fenêtre principale, la sous-fenêtre la recouvre.
Ceci provoque un effet de clignotement rapide tant que les deux fenêtres sont tracées alternativement.
Cela n'est évidemment pas l'effet souhaité, aussi devront nous attendre les futures explications de
Miguel sur la façon de contourner le problème en utilisants des sous-fenêtres en manipulant les piles
matricielles.
Deuxièmement, je voudrais montrer comment on peut s'affranchir du problème qui consiste à conserver
la souris active (focus) en utilisant le rendu plein écran avec une 3Dfx. Le rendu plein écran
avec une 3Dfx est réalisé au moyen du tampon de la 3Dfx au lieu de celui de l'adaptateur de votre carte
video 2D. Le résultat est que la fenêtre est crée pour le programme sur le bureau en 2D, mais que tout
le rendu l'est en plein écran par la 3Dfx. Sur un système mono-moniteur, la 3Dfx prend le dessus et vous
ne pourrez pas voir la fenêtre sur le bureau 2D. Par contre sur un système à deux moniteurs, l'un vous
montrera votre bureau 2D et la fenêtre crée pour le programme, tandis que sur l'autre moniteur vous
pourrez voir le rendu plein écran du programme.
Sur les systèmes mono-moniteur, il peut être parfois difficile de maintenir la fenêtre
principale active sur le bureau 2D parce que vous ne pourrez pas voir la fenêtre. Si la fenêtre sur
le bureau 2D perd la main (le focus), elle ne pourra plus accepter d'entrées. Si le programme ne peut
pas accepter des entrées pour détecter quand l'utilisateur appuie sur une touche de sortie déterminée
et que cet utilisateur ne peut pas voir le bureau 2D pour localiser le bouton dans la fenêtre, et
donc terminer le programme, il ne pourra pas le quitter!
Une astuce que vous pouvez utiliser pour contourner ce problème, est d'utiliser les fonctions
glutFullScreen() et glViewport(). La fonction glutFullScreen() redimensionne la fenêtre du programme
aux dimension du bureau 2D de telle sorte qu'elle y soit en plein écran. Vous pouvez appeler glutFullScreen()
après avoir créé une fenêtre pour la dimensionner en plein écran sur le bureau 2D. Quand la fenêtre
occupe tout l'écran, la souris ne peut plus quitter la fenêtre et cette dernière à toujours la main (focus).
La fonction glViewport() dit au programme quelle sera l'étendue de la zone de tracé sur l'écran.
Quand vous spécifiez une telle zone (viewport), tous les tracés sont rendus dans cette zone. Pour la 3Dfx,
où normalement vous devriez appeller glViewport() dans une fonction de rappel de redimensionnement pour
définir le viewport aux nouvelles dimensions de la fenêtre, appelez glViewport() avec les dimensions de la
résolution de la 3Dfx. Si la 3Dfx fonctionne à 640x480, appellez glViewport(0,0,800,600). Ceci fera tracer
le programme aux dimensions du viewport que vous avez spécifiées à la résolution de la carte 3Dfx même si la
fenêtre est en plein écran.
J'ai inclus une version modifiée de triangles ombrés et lissés de Miguel pour marcher avec la 3Dfx
(../../common/March1998/example3.c,../../common/March1998/Makefile). J'ai simplement exclus les
sous-fenêtres ajouté glutFullscreen() au bon endroit (après la création de la fenêtre) et changé glViewport()
dans la fonction de rappel de redimensionnement pour forcer le viewport à 640x480 (la résolution de ma
carte 3Dfx). Remarquez que si vous l'exécutez sans la 3Dfx (en n'affectant pas la variable d'environnement
MESA_GLX_FX) la fenêtre du programme s'ouvrira aux dimension de votre bureau, mais le tracé est seulement
rendu sur une surface de 640x480 dans cette fenêtre. Si vous exécutez le programme avec la 3Dfx, le tracé
s'effectue sur la totalité de la 3Dfx et le programme perd la main.
Remarqez aussi que quand le programme est exécuté sans la 3Dfx, il peut être vraiment très lent
du fait du rafraîchissement de toute la fenêtre au lieu de se limiter au viewport. Ceci porte un coup
aux performances quand le rendu s'effectue sur le bureau 2D mais c'est correct avec le plein écran 3Dfx.
Pour cette raison, vous pouvez écrire vos programmes pour détecter si la 3Dfx est utilisée (en lisant la
variable d'environnement MESA_GLX_FX) et en utilisant soit le truc de glutFullScreen() qui force le
glViewport() si la 3Dfx est détectée, soit ne pas utiliser le truc si la 3Dfx n'est pas détectée.
|