...try {InputStream stream = Imaging . class . getResourceAsStream (" stone . tga ");img = TGAImage . read ( stream );bb = img . getData ();stream . close ();} catch ( IOException e) {e. printStackTrace ();}gl. glTexImage2D ( GL2 . GL_TEXTURE_2D , 0, GL2 . GL_RGB ,img . getWidth () , img . getHeight () ,0, img . getGLFormat () , GL2 . GL_UNSIGNED_BYTE , bb );// Activar as texturasgl. glEnable ( GL2 . GL_TEXTURE_2D );// ...A face frontal tem que ser <strong>de</strong>senhada na or<strong>de</strong>m CCW para que a nossa textura seja aplicada correctamente.Assim a or<strong>de</strong>m <strong>de</strong> <strong>de</strong>senho correcta será - cTop-cFrontLeft-cFrontRight. As coor<strong>de</strong>nadas são especificadas <strong>de</strong>forma semelhante às da Figura 8.4(b).O código em baixo calcula o verctor normal à face frontal (vNormal), especifica as coor<strong>de</strong>nadas da texturapara cada vértice (glTexCoord) e <strong>de</strong>senha-o 1 :// Face da FrentevNormal = GlTools . getNormalVector (cTop , cFrontLeft , cFrontRight );gl. glNormal3fv ( vNormal . toArray () , 0);gl. glTexCoord2f (.5f, 1f);cTop . draw ();gl. glTexCoord2f (0f, 0f);cFrontLeft . draw ();gl. glTexCoord2f (1f, 0f);cFrontRight . draw ();O <strong>de</strong>senho das restantes faces do triângulo são feitas <strong>de</strong> forma semelhante. A Figura 8.6 mostra o output doficheiro Pyramid.java.Figura 8.6: Output do ficheiro Pyramid.java1 Por uma questão <strong>de</strong> conveniência a class GLVector tem um método que <strong>de</strong>senha o vector actual utilizando a função glVertex83
8.4 Texture EnvironmentNo exemplo Pyramid, a pirâmi<strong>de</strong> é <strong>de</strong>senhada utilizando material <strong>de</strong> cor branca e a textura é aplicada <strong>de</strong> formaque as suas cores são “escaladas” (scaled) segundo a cor da geometria (branca) (Figura 8.7).Figura 8.7: Geometria Branca + Texture = Sha<strong>de</strong>d TextureA forma como a cor dos texels é combinada com a geometria subjacente é controlada pelo texture environment.A sua configuração é feita utilizando a função glTexEnv:glTexEnvi ( int target , int pname , int param );glTexEnvf ( int target , int pname , float param );glTexEnviv ( int target , int pname , IntBuffer param );glTexEnvfv ( int target , int pname , FloatBuffer param );Esta função po<strong>de</strong> ser usada <strong>de</strong> várias formas, e permite configurar parâmetros avançados das texturas. Noexemplo Pyramid, o environment mo<strong>de</strong> é confiurado com o valor GL MODULATE:gl. glTexEnvi ( GL2 . GL_TEXTURE_ENV , GL2 . GL_TEXTURE_ENV_MODE , GL2 . GL_MODULATE );Com a opção GL MODULATE, a cor do texel é multiplicada pela cor da geometria (<strong>de</strong>pois do calculo das luzes).Ao especificar uma cor clara para a geometria (branca, no exemplo) a textura é afectada <strong>de</strong> forma igual àgeometria. Isto permite com a mesma textura obter várias colorizações.Utilizando GL REPLACE, po<strong>de</strong>mos substituir completamente a cor da geometria pela cor do texel. Isto eliminatodos os efeitos aplicados à geometria subjacente. Se a textura tiver um alpha channel po<strong>de</strong>mos utilizar estemodo para tornar zonas da geometria transparente se a imagem contiver blocos também transparentes, activandoo blending.A opção GL DECAL é semelhante à opção GL REPLACE se a imagem não tiver alpha channel. No caso <strong>de</strong> aimagem ter um alpha channel a cor da geometria transparece pela textura no valor do alpha, <strong>de</strong> forma que oobjecto parece ser blen<strong>de</strong>d com os fragmentos subjacentes.Po<strong>de</strong>mos também fazer o blending da geometria com uma cor fixa (Figura 8.8) utilizando:gl. glTexEnvi ( GL2 . GL_TEXTURE_ENV ,GL2 . GL_TEXTURE_ENV_MODE , GL2 . GL_BLEND );gl. glTexEnvfv ( GL2 . GL_TEXTURE_ENV ,GL2 . GL_TEXTURE_ENV_COLOR , new float [] {1f, 0f, 0f, 0f}, 0);Figura 8.8: Utilizando GL BLENDFinalmente po<strong>de</strong>mos fazer a adição do valor da cor dos texels aos fragmentos da geometria, utilizando GL ADDcomo argumento. Os valores que ultrapassem 1.0 são truncados, o que po<strong>de</strong>rá provocar saturação das cores.84