Manual de Apoio 2010
Manual de Apoio 2010
Manual de Apoio 2010
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
No JOGL a configuração do display é feita alterando as capacida<strong>de</strong>s na classe GLDrawable 1 . As capacida<strong>de</strong>sactuais do display po<strong>de</strong>m ser consultadas utilizando:public class MyGl implements GLEventListener {...@Overri<strong>de</strong>public void init ( GLAutoDrawable drawable ) {GLCapabilities cap = drawable . getChosenGLCapabilities ();boolean db = cap . getDoubleBuffered ();...}...}O double buffering encontra-se activo por omissão. Po<strong>de</strong> no entanto ser activado ou <strong>de</strong>sactivado utilizando ocódigo:GLCapabilities cap = drawable . getChosenGLCapabilities ();// Desactivar o double buffercap . setDoubleBuffered ( false );A troca <strong>de</strong> buffers po<strong>de</strong> ser conseguida utilizando a função GLDrawable.swapBuffers() 2 .Utilizando Buffer TargetsÉ possível <strong>de</strong>senhar directamente no front buffer dizendo ao OpenGL qual o buffer <strong>de</strong> <strong>de</strong>stino (target) para asprimitivas que estamos actualmente a <strong>de</strong>senhar, utilizando:gl. glDrawBuffer ( int mo<strong>de</strong> );Especificando GL2.GL FRONT, <strong>de</strong>senhamos directamente no front buffer, utilizando GL2.GL BACK, remetemoso <strong>de</strong>senho para o back buffer. Outra forma <strong>de</strong> <strong>de</strong>senhar directamente no front buffer passa pela <strong>de</strong>sactivação dodouble buffering.Ao <strong>de</strong>senhar com recurso a um único buffer é aconselhável a utilização da função glFlush ou glFinish paraforçar o pipeline a processar a lista <strong>de</strong> comandos no buffer.4.4.1 Buffer <strong>de</strong> Profundida<strong>de</strong>O OpenGL suporta mais buffers para além dos buffers <strong>de</strong> cor. Um <strong>de</strong>les é o <strong>de</strong>pth buffer que em vez <strong>de</strong> armazenarvalores <strong>de</strong> cor, armazena valores <strong>de</strong> profundida<strong>de</strong>.O teste <strong>de</strong> profundida<strong>de</strong> faz correspon<strong>de</strong>r a cada elemento <strong>de</strong> cor no color buffer, um valor <strong>de</strong> profundida<strong>de</strong>no <strong>de</strong>pth buffer.Para utilizar o buffer <strong>de</strong> profundida<strong>de</strong> usamos o código:gl. glEnable ( GL2 . GL_DEPTH_TEST );Para <strong>de</strong>sactivar temporariamente o teste <strong>de</strong> profundida<strong>de</strong> sem <strong>de</strong>scartar os valores actualmente no buffer,po<strong>de</strong>mos utilizar:gl. glDepthMask ( false );Utilizando true em vez <strong>de</strong> false, po<strong>de</strong>mos reactivar o teste <strong>de</strong> profundida<strong>de</strong>.4.4.2 ScissorsAfim <strong>de</strong> optimizar recursos, po<strong>de</strong> ser pertinente <strong>de</strong>senhar apenas uma porção do ecrã. O OpenGL permite <strong>de</strong>finira zona rectangular do ecrã que é ren<strong>de</strong>rizada.O rectângulo po<strong>de</strong> ser <strong>de</strong>finido activando o scissor test com recurso à função glEnable(GL2.GL SCISSOR TEST)e <strong>de</strong>finindo a o seu rectângulo, utilizando a função:GL2 . glScissor ( int x, int y, int width , int height );Os valores x e y especificam o canto inferior direito do rectângulo. Os valores width e height <strong>de</strong>finem alargura e altura do rectângulo.1 No caso da interface GLEventListener, os métodos recebem uma instância <strong>de</strong> um GLAutoDrawable que é do tipo GLDrawablepor herança2 Quando o double buffering está activo, isto é feito <strong>de</strong> forma automática37