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