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.
|