int x, GLint y,int width , int height);glCopyTexSubImage3D (int target , int level ,int xoffset , int yoffset , int zoffset ,int x, GLint y,int width);Po<strong>de</strong>m ter reparado que não existe uma função glCopyTexImage3D, isto <strong>de</strong>ve-se ao facto do color bufferser bi-dimensional. No entanto po<strong>de</strong>mos querer copiar informação do color buffer para uma face (plano?) emespecífico da nossa textura 3D, isso po<strong>de</strong> ser conseguido utilizando glCopyTexSubImage3D.8.2 Mapeamento <strong>de</strong> Texturas à GeometriaAo activar o mapeamento <strong>de</strong> texturas, o OpenGL permite-nos mapear qualquer textura a qualquer uma dasprimitivas. No entanto, é necessário fornecer ao OpenGL informação acerca <strong>de</strong> como esse mapeamento é feito, oque é conseguido especificando uma coor<strong>de</strong>nada na textura (texture coordinate) para cada vértice. Os texels 1não são especificados utilizando posições <strong>de</strong> memória, tal como nos pixmaps, mas com um sistema <strong>de</strong> coor<strong>de</strong>nadasmais abstracto. As coor<strong>de</strong>nadas das texturas são normalmente especificadas utilizando valores entre 0.0 e 1.0.Os nomes das coor<strong>de</strong>nadas são s, t, r e q (semelhantes á coor<strong>de</strong>nadas vectoriais x, y, z e w). A Figura 8.3mostra como os texels são especificados com base em coor<strong>de</strong>nadas 1D, 2D e 3D.Figura 8.3: Coor<strong>de</strong>nadas dos texels numa texturaO factor q representa um factor <strong>de</strong> escala da textura, à semelhança do valor w dos vértices. Ou seja, osvalores das coor<strong>de</strong>nadas das texturas são realmente s/q, t/q e r/q. Por omissão q=1.0.A coor<strong>de</strong>nada na textura é especificada utilizando a função glTexCoord. Esta função tem um conjunto <strong>de</strong>variações para vários objectivos, à semelhança das funções em geral do OpenGL. Algumas formas simples <strong>de</strong>stasfunções são:glTexCoord1f ( float s);glTexCoord2f ( float s, float t);glTexCoord3f ( float s, float t, float r);A coor<strong>de</strong>nada da textura é aplicada utilizando estas funções para cada um dos vértices. O OpenGL estica ouencolhe (alias stretching) a textura <strong>de</strong> forma a aplicá-la na geometria especificada com base nas coor<strong>de</strong>nadasespecíficadas. A forma como o stretching é feito <strong>de</strong>pen<strong>de</strong> do filtro da textura (texture filter) actual, discutidomais à frente. A Figura 8.4(a) mostra o exemplo <strong>de</strong> ume textura bi-dimensional aplicada a um GL QUAD. Noscantos do quad temos as coor<strong>de</strong>nadas correspon<strong>de</strong>ntes da textura. A função glTexCoord tem que ser utilizadaantes <strong>de</strong> cada chamada à função glVertex.Esta coincidência entre geometria e textura é rara. Um exemplo mais comum será o da Figura 8.4(b). Ascoor<strong>de</strong>nadas da textura neste caso não coinici<strong>de</strong>m com a forma da geometria.1 Um texel é um fragmento da textura, tal como o pixel <strong>de</strong> um pixmap81
(a) Textura bi-dimensional aplicada a umquad(b) Textura bi-dimensional aplicada a umtriânguloFigura 8.4: Aplicação <strong>de</strong> textura bi-dimensionalTexture MatrixÀ semelhança da matriz MODELVIEW, PROJECTION e COLOR, é também possível operar transformações na matriz<strong>de</strong> coor<strong>de</strong>nadas das texturas, po<strong>de</strong>mos fazê-lo passando para a texture matrix:glMatrixMo<strong>de</strong> ( GL2 . GL_TEXTURE );Depois <strong>de</strong>sta chamada todas as transformações são operadas nas coor<strong>de</strong>nadas da textura. No entanto,a stack <strong>de</strong> tranformações só tem dois níveis <strong>de</strong> profundida<strong>de</strong>, o que implica que só po<strong>de</strong>mos utilizar doisglPushMatrix/glPopMatrix enca<strong>de</strong>ados.8.3 Exemplo <strong>de</strong> Textura 2DExiste um conjunto <strong>de</strong> conceitos ainda por adquirir relacionados com as texturas, tais como coordinate wrapping,texture filters e texture environment. A fim <strong>de</strong> os abordar utilizamos como plataforma um exemplo simples 2D,com configurações comuns <strong>de</strong>stes parâmetros. O código fonte do exemplo Pyramid.java po<strong>de</strong> ser consultado noApêndice C.3.Figura 8.5: Exemplo pyramidA Figura 8.5 ilustra a posição dos cantos da pirâmi<strong>de</strong>. A <strong>de</strong>claração será feita no método init() do nossoGLEventListener da seguinte forma:// Cantos da Pirami<strong>de</strong>cTop = new GLVector (0.0f, .80f, 0.0 f);cBackLeft = new GLVector ( -0.5f, 0.0f, -.50f);cBackRight = new GLVector (0.5f, 0.0f, -0.50 f);cFrontRight = new GLVector (0.5f, 0.0f, 0.5 f);cFrontLeft = new GLVector ( -0.5f, 0.0f, 0.5 f);Ainda no método init(), carregamos a imagem que irá servir para aplicar textura na nossa geometria, eactivamos o TEXTURE 2D:82