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