Sommaire Index Rechercher Liens A Propos
[LinuxFocus Image]
[Navegation Bar]
  Nouvelles   Archives

Le matériel:
La programmation OpenGL & GLUT avec Voodoo 3Dfx à l'esprit

par Phil Ross


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.


Traduit par John B. Perr

Pour plus d'information
© 1998 Phillip Ross
Ce site web est maintenu par Miguel A Sepulveda.