Dit document is beschikbaar in: English Castellano Deutsch Francais Nederlands Russian Turkce |
door Phil Ross <phil/at/ryoko.cis.pitt.edu> Vertaald naar het Nederlands door: Guus Snijders <ghs(at)linuxfocus.org> |
Hardware Review: OpenGL & GLUT programmeren voor Voodoo 3dfxKort:
Dit is een meer gedetailleerde beschrijving over het programmeren met OpenGL
op een Voodoo 3Dfx grafische kaart.
|
In mijn vorige artikel schreef ik over de 3Dfx en hoe goed die Mesa hardware accelleratie ondersteund. We hebben even kort gekeken naar de voor- en nadelen van Mesa+3Dfx, deze keer gaan we verder in op een aantal van deze nadelen en hoe een ontwikkelaar er omheen kan werken.
Om te beginnen, legt Miguel's informatieve artikel uit hoe je de GLUT kunt gebruiken om te renderen in sub-vensters binnen het hoofdvenster. Helaas biedt de 3Dfx driver voor Mesa op dit moment maar een context. Als je probeert om een subvenster te renderen in het hoofdvenster, zul je zien dat in plaats van dat het subvenster binnen het hoofdvenster wordt gerenderd, deze over het hoofdvenster heen wordt gerenderd. Dit produceerd een snelknipperend effect, doordat het sub- en hoofdvenster erg snel worden gerenderd. Dit is uiteraard niet het effect dat je hoopte te bereiken met subvensters, dus zul je moeten wachten op Miguel's verdere uitleg over hoe je subvensters kunt omzeilen door het manipuleren van matrix stacks.
Ten tweede, wilde ik graag laten zien hoe je het probleem van het vasthouden van de muis focus tijdens fullscreen rendering met de 3Dfx kunt oplossen. Wanneer je fullscreen renderd met de 3Dfx, gebeurd het renderen in de 3Dfx's framebuffer, in plaats van je 3D video adapter's framebuffer. Het resultaat is dat er een venster voor je programma wordt gecreëerd op je 2D desktop, maar alle rendering voor het programma gebeurd fullscreen op de 3Dfx. Op een single-head (1 monitor) systeem, neemt de 3Dfx de monitor over en zie je niet het venster op je 2D dekstop, maar op een dualhead (2 monitoren) systeem, zal 1 monitor je 2D desktop weergeven en op de andere monitor zie je de fullscreen rendering van het programma.
Op single-head systemen is het vaak lastig om het programma venster de muisfocus op de 2D desktop te houden, omdat je het venster niet ziet. Als het programma venster op de 2D desktop de focus verliest, neemt het geen invoer meer. Als het programma niet kan detecteren wanneer de gebruiker een aangewezen exit toets indrukt, en de gebruiker kan de 2D desktop niet zien om de afsluitknop op het venster te vinden en zo het programma af te sluiten, kan de gebruiker het programma niet stoppen!
Een truuk die je kunt gebruiken om hier omheen te werken, is het gebruik van de glutFullScreen() en glViewport() functies. De glutFullScreen() functie past de grootte van het venster op de 2D desktop zo aan, dat deze fullscreen wordt. Deze functie kun je bijvoorbeeld aanroepen na het maken van een venster, om vervolgens dit venster fullscreen op de 2D desktop te maken. Als het venster fullscreen is, kan de muis het venster niet verlaten en zal het venster dus altijd de focus behouden.
De glViewport() functie verteld het programma hoe groot de viewport voor het programma zal zijn. Als je een viewport opgeeft, vindt alle rendering plaats in die viewport. Voor de 3Dfx, waar je normaal glViewport() aan zou roepen in een resize functie om de viewport voor de nieuwe dimensies van het venster te zetten, maak je een aanroep naar glViewport() met de dimensies van de resolutie van de 3Dfx. Als je de 3Dfx op 640x480 gebruikt, roep je glViewport(0,0,640,480) aan en als je op 800x600 draait, roep je glViewport(0,0,800,600) aan. Dit zorgt er voor dat het programma op de viewport dimensies renderd die je opgaf als de resolutie van je 3Dfx kaart, zelfs al is het venster fullscreen.
Ik heb een versie van Miguel's driehoek aangepast om te werken met de 3Dfx (example3.c, Makefile). Ik heb gewoon simpelweg de subvensters uitgeschakeld, glutFullscreen() op de juiste plaats toegevoegd en glViewport() in de reshape callback functie aangepast om de viewport op 640x480 te forceren (de resolutie van mijn 3Dfx kaart). Merk op dat als je het start zonder de 3D (door de MESA_GLX_FX omgevingsvariabele niet te zetten), het programma op de volledige resolutie van je 2D desktop zal openen, maar dat de rendering op een 640x480 gebied binnen dat venster plaatsvindt. Als je het programma start met 3Dfx, zul je zien dat de rendering op de volle grootte van de 3Dfx plaatsvindt en het programma nu de focus verliest.
Nog iets om op te merken, als je het programma start zonder de 3Dfx, kan het programma echt traag worden door het feit dat het volledige venster wordt geüpdate, in plaats van alleen de viewport. Dit kan een behoorlijke aanslag op de performance betekenen voor het renderen van je 2D desktop, maar voor fullscreen 3D is het ok. Om deze reden, zou je je programma's kunnen schrijven om te controleren of de 3Dfx wordt gebruikt (door de MESA+GLX_FX variabele te detecteren en te lezen) en ofwel glutFullScreen() om de glViewport() truuk te forceren of om de truuk niet te gebruiken als de 3Dfx niet wordt gedetecteerd.
Site onderhouden door het LinuxFocus editors team
© Phil Ross "some rights reserved" see linuxfocus.org/license/ http://www.LinuxFocus.org |
Vertaling info:
|
2004-12-27, generated by lfparser version 2.50