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


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

Para más información: