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.