ByteBuffer fire = ByteBuffer . wrap ( new byte [] {( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 ,( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 ,( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 ,( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 ,( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 ,( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 ,( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0xc0 ,( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x01 , ( byte ) 0xf0 ,( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x07 , ( byte ) 0xf0 ,( byte ) 0x0f , ( byte ) 0x00 , ( byte ) 0x1f , ( byte ) 0xe0 ,( byte ) 0x1f , ( byte ) 0x80 , ( byte ) 0x1f , ( byte ) 0xc0 ,( byte ) 0x0f , ( byte ) 0xc0 , ( byte ) 0x3f , ( byte ) 0x80 ,( byte ) 0x07 , ( byte ) 0xe0 , ( byte ) 0x7e , ( byte ) 0x00 ,( byte ) 0x03 , ( byte ) 0xf0 , ( byte ) 0xff , ( byte ) 0x80 ,( byte ) 0x03 , ( byte ) 0xf5 , ( byte ) 0xff , ( byte ) 0xe0 ,( byte ) 0x07 , ( byte ) 0xfd , ( byte ) 0xff , ( byte ) 0xf8 ,( byte ) 0x1f , ( byte ) 0xfc , ( byte ) 0xff , ( byte ) 0xe8 ,( byte ) 0xff , ( byte ) 0xe3 , ( byte ) 0xbf , ( byte ) 0x70 ,( byte ) 0x<strong>de</strong> , ( byte ) 0x80 , ( byte ) 0xb7 , ( byte ) 0x00 ,( byte ) 0x71 , ( byte ) 0x10 , ( byte ) 0x4a , ( byte ) 0x80 ,( byte ) 0x03 , ( byte ) 0x10 , ( byte ) 0x4e , ( byte ) 0x40 ,( byte ) 0x02 , ( byte ) 0x88 , ( byte ) 0x8c , ( byte ) 0x20 ,( byte ) 0x05 , ( byte ) 0x05 , ( byte ) 0x04 , ( byte ) 0x40 ,( byte ) 0x02 , ( byte ) 0x82 , ( byte ) 0x14 , ( byte ) 0x40 ,( byte ) 0x02 , ( byte ) 0x40 , ( byte ) 0x10 , ( byte ) 0x80 ,( byte ) 0x02 , ( byte ) 0x64 , ( byte ) 0x1a , ( byte ) 0x80 ,( byte ) 0x00 , ( byte ) 0x92 , ( byte ) 0x29 , ( byte ) 0x00 ,( byte ) 0x00 , ( byte ) 0xb0 , ( byte ) 0x48 , ( byte ) 0x00 ,( byte ) 0x00 , ( byte ) 0xc8 , ( byte ) 0x90 , ( byte ) 0x00 ,( byte ) 0x00 , ( byte ) 0x85 , ( byte ) 0x10 , ( byte ) 0x00 ,( byte ) 0x00 , ( byte ) 0x03 , ( byte ) 0x00 , ( byte ) 0x00 ,( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x10 , ( byte ) 0 x00});Os bitmaps são <strong>de</strong>senhados no ecrã recorrendo ao raster dos seus bits. Precisamos então <strong>de</strong> dizer ao OpenGLqual será a posição em que <strong>de</strong>ve ser feito o raster da nossa imagem, com recurso à função glRasterPos. A funçãoglRasterPos é po<strong>de</strong> receber 2 ou 3 argumentos, sendo que na primeira o eixo z toma o valor 0. O exemplomostra uma possível utilização da função:gl. glClear ( GL2 . GL_COLOR_BUFFER_BIT | GL2 . GL_DEPTH_BUFFER_BIT );// Bitmap <strong>de</strong> cor Ver<strong>de</strong>gl. glColor3f (0.0f, 1.0f, 0.0 f);for ( int i =0; i < 16; i ++) {// Definir coor<strong>de</strong>nadas do Rastergl. glRasterPos3d (i - 5, 1, i - 5);// Desenhar o bitmap 32 x32 no array <strong>de</strong> bytesgl. glBitmap (32 , 32 , 0f, 0f, 0, 0, fire );}gl. glColor3f (.5f, .5f, .5f);GlUtil . drawGround ( GL2 . GL_LINE_STRIP ,20f, 1f);No exemplo em cima, são <strong>de</strong>senhados 16 bitmaps percorrendo uma diagonal que atravessa o ponto (0, 0, 0).O nosso bitmap é <strong>de</strong>senhado utilizando a função:glBitmap (int width , int height ,float xorig , float yorig ,float xmove , float ymove ,ByteBuffer bitmap );O width e height referem-se ao tamanho em bits do bitmap, no nosso caso 32×32, o xorig e o yorigreferem-se ao offset x e y em relação à posição raster, o xmove e o ymove <strong>de</strong>finem a posição <strong>de</strong> raster quandoo <strong>de</strong>senho terminar e o parâmetro bitmap contém os dados a <strong>de</strong>senhar. Os bits a 1 no nosso bitmap serão69
transformados em fragmentos (pixel) com a cor actualmente <strong>de</strong>finida, os 0 não afectaram as cores actualmenteno color buffer.O resultado do código em cima po<strong>de</strong> ser visualizado na Figura 7.3.Figura 7.3: Utilização <strong>de</strong> glBitmap/glRasterPosAs coor<strong>de</strong>nadas da função glRasterPos são afectadas pela projecção e posição do observador. Se quisermosque o nosso bitmap seja mostrado sempre na mesma posição no ecrã, in<strong>de</strong>pen<strong>de</strong>ntemente do projecção eobservador, <strong>de</strong>vemos utilizar a função glWindowPos, por exemplo:gl. glColor3f (1.0f, 0.0f, 0.0 f);// colocar o raster o canto inferior esquerdo do ecragl. glWindowPos2i (10 , 10);gl. glBitmap (32 , 32 , 0f, 0f, 0, 0, fire );7.2 PixmapsOs pixmaps são <strong>de</strong> maior utilida<strong>de</strong> nos sistemas full-color. O seu layout na memória é parecido ao dos bitmaps,no entanto, cada pixel po<strong>de</strong> conter mais do que um bit <strong>de</strong> informação. Cada pixel po<strong>de</strong> conter informação acercada intensida<strong>de</strong> (referida normalmente como luminance) ou acerca dos componentes <strong>de</strong> cor.Um pixmap po<strong>de</strong> ser <strong>de</strong>senhado a partir da posição actual do raster utilizando a função:void glDrawPixels (int width , int height ,int format , int type ,Buffer pixels )Os primeiros dois argumentos (width/height) referem-se ao tamanho do pixmap em pixels. O argumentoformat refere-se à forma como a informação está disposta, normalmente referido como formato da imagem (verTabela B.1). O argumento type <strong>de</strong>fine o tipo <strong>de</strong> dados na informação e o último argumento contém a informaçãoda imagem 1 . Ao contrário da função glBitmap, a posição <strong>de</strong> raster não é alterada.Os formatos GL STENCIL INDEX e GL DEPTH COMPONENT, são utilizados para ler e escrever informação nosstencil e <strong>de</strong>pth buffers.O argumento type <strong>de</strong>fine o tipo <strong>de</strong> dados armazenados no nosso pixmap. Os valores possíveis para o tipo <strong>de</strong>dados estão <strong>de</strong>scritos na Tabela B.2 2 .1 No JOGL, em vez <strong>de</strong> arrays é recomendada a utilização <strong>de</strong> buffers - http://java.sun.com/<strong>de</strong>veloper/technicalArticles/releases/nio/2 Na tabela estão omissos os packed RGB value, para mais informação consultar - http://www.opengl.org/registry/specs/EXT/packed_pixels.txt70