Hogar Indice Busqueda Enlaces Sobre Nosotros
[LinuxFocus Image]
[Navegation Bar]
  Noticias   Archivos   Compañías   Consejos 

Revisi�n hardware:
Programando en OpenGL & GLUT con la tarjeta Voodoo 3dfx

por Phil Ross


En mi �ltimo art�culo escrib� acerca del 3Dfx y el buen rendimiento que se consegu�a con la biblioteca Mesa. Mencion� las ventajas e inconvenientes de utilizar Mesa + 3Dfx. En este art�culo me gustar�a centrarme en los detalle de algunas de �stas desventajas y en qu� hacer para evitarlas.

Para empezar, decir que el art�culo de Miguel explica como debemos utilizar la biblioteca GLUT para dibujar (to render) dentro de subventanas en una ventana principal. Cuando utilizamos subventanas, se crea un nuevo contexto independiente de la ventana principal. Desafortunadamente, el controlador 3Dfx para Mesa soporta �nicamente un contexto simult�neo. Si intentas utilizar subventanas con el 3Dfx observar�s que en lugar de dibujar la subventana dentro de la ventana pricipal, �sta se situa encima de ella. Esto produce un efecto de parpadeo, ya que la ventana principal y la subventana se redibujan aternativamente muy deprisa. Obviamente �ste no era el efecto que nosotros quer�amos, de modo que tendremos que esperar una pr�xima explicaci�n de Miguel sobre c�mo utilizar subventanas manipulando pilas de matrices.

Segundo, me gustar�a mostrar c�mo es posible superar el problema de mantener el foco del rat�n cuando se dibuja a pantalla completa con el 3Dfx. En �ste caso, el rendering se realiza en la memoria del 3Dfx en lugar de en la memoria de nuestro adaptador de v�deo 2D. El resultado es una ventana creada por el programa en nuestro escritorio, pero todo el trabajo se lleva a cabo por el 3Dfx sobre la pantalla completa. En sistemas con una �nica pantalla, el 3Dfx utiliza el monitor y no podremos ver la ventana en el escritorio, pero en sistemas con pantalla dual, un monitor mostrar� nuestro escritorio y la ventana creada, mientras que en el otro veremos el renderizado del programa.

En sistemas de una �nica pantalla, suele ser complicado mantener el foco del rat�n dentro de la ventana del programa puesto que no se puede ver la ventana. Si la ventana del programa pierde el foco, no podremos aceptar ninguna entrada. Si el programa tiene que aceptar alguna entrada para detectar que el usuario quiere salir del programa, y no puede ver el escritorio para localizar el bot�n de salida, � no podr� cerrar el programa !

Un truco que puedes utilizar para solucionar el problema es utilizar las funciones glutFullScreen() y glViewport(). La funci�n glutFullScreen() maximiza la ventana del programa. Lo que puedes hacer es llamar a glutFullScreen() despu�s de crear la ventana para maximizarla. Cuando la ventana est� maximizada, no habr� manera de que el rat�n salga de la ventana, no pudiendo por tanto perder el foco.

La funci�n glViewport() indica como quiere que sea de grande el �rea de dibujo del programa. Cuando especificas un tama�o de �rea, todo el renderizado se hace dentro de la ventana. Para el 3Dfx, donde normalmente se hace una llamada a glViewport() desde la rutina de callback de redimensionado (reshape) para asignar las nuevas coordenadas de la ventana a coordenadas del �rea de dibujo, haz una llamada a a glViewport() con las dimensiones de la resolucion del 3Dfx. Por ejemplo, si est�s trabajando con el 3Dfx a una resoluci�n de 640x480 deber�as hacer glViewport(0,0,640,480) y si trabajas a 800x600 deber�as hacer glViewport(0,0,800,600). Esto har� que el programa dibuje en el �rea que has especificado para trabajar con la tarjeta 3Dfx, aunque la ventana del programa est� en pantalla completa.

He incluido una versi�n del tri�ngulo sombreado-suavizado de Miguel modificado para poder trabajar con el 3Dfx (../../common/March1998/example3.c, ../../common/March1998/Makefile). Simplemente he excluido la subventana, he a�adido la llamada a la funci�n glutFullscreen en el lugar apropiado (despu�s de la creaci�n de la ventana), y cambiado glViewport() en la funci�n que del callback de redimensionado, para forzar el �rea de dibujo a 640x480 (la resoluci�n de mi tarjeta 3Dfx). Si estas ejecutando sin el 3Dfx (no activando la variable de entorno MESA_GLX_FX) observar�s que la ventana del programa se maximizar� a las dimensiones de nuestro escritorio, pero s�lo se dibujar� en un �rea de 640x480 dentro de la ventana. Si se ejecuta el programa con el 3Dfx, ver�s que el renderizado se realiza al tama�o m�ximo que del 3Dfx, por lo que el programa perder� el foco.

Otra cosa a tener en cuenta, es que cuando se ejecuta el programa sin el 3Dfx, el programa funciona muy lento, debido a que se actualiza la ventana completa en lugar del �rea de dibujo especificada con glViewport(). Esto produce en una p�rdida de prestaciones cuando renderizamos en el escritorio, pero funciona bien a pantalla completa con el 3Dfx. Por esta raz�n, puedes querer escribir tus programas de forma que detecten cuando se est� utilizando el 3Dfx (detectando y leyendo la variable de entorno MESA_GLX_FX) y utilizar el truco de glutFullScreen() y glViewport() s�lo en este caso.


Traducido por Juan Jos� Paneque

Para m�s informaci�n:
© 1998 Phillip Ross
P�ginas web mantenidas por Miguel A Sepulveda.