int target , int level , int internalformat ,int width , int height , int <strong>de</strong>pth , int bor<strong>de</strong>r ,int format , int type ,Buffer pixels);Estas três funções permitem-nos dizer ao OpenGL tudo aquilo que ele precisa <strong>de</strong> saber relativamente à imagemcontida no array pixels. A função glTextImage carrega para a memória, a imagem fornecida e torna-a atextura actual a ser aplicada na geometria. Este carregamento para a memória po<strong>de</strong> ser dispendioso (alternativasdiscutidas mais à frente na Secção 8.6).O valor do target para cada uma das funções é respectivamente : GL TEXTURE 1D, GL TEXTURE 2D eGL TEXTURE 3D ou GL PROXY TEXTURE 1D, GL PROXY TEXTURE 2D ou GL PROXY TEXTURE 3D. Ao utilizar proxies,o OpenGL faz uma verificação prévia do que o sistema suporta em termos <strong>de</strong> compatibilida<strong>de</strong>, no caso <strong>de</strong> nãohaver suporte, o estado da imagem é tornado inválido sem que qualquer tipo <strong>de</strong> erro seja reportado 1 .O argumento level <strong>de</strong>fine o nível <strong>de</strong> mipmapping (discutido na Secção 8.5.3), <strong>de</strong> momento utilizaremostexturas sem mipmapping, especificando o valor 0.O argumento internalFormat, especifica quantos componentes <strong>de</strong> cor são armazenados por texel, o espaçonecessário ao armazenamento dos componentes e/ou se a textura é comprimida. A Tabela 8.1 lista os valoresmais comuns para este parâmetro.ConstanteGL ALPHAGL LUMINANCEGL LUMINANCE ALPHAGL RGBGL RGBAArmazenar os texels como:Valores <strong>de</strong> alphaValores <strong>de</strong> luminânciaValores <strong>de</strong> luminância e alphaComponentes <strong>de</strong> red, green e blueComponentes <strong>de</strong> red, green, blue e alphaTabela 8.1: Factores <strong>de</strong> Blending do OpenGLOs valores <strong>de</strong> width, height e <strong>de</strong>pth (apropriadamente) especificam as dimensões da textura que estamosa carregar para a memória. Estas dimensões <strong>de</strong>vem ser inteiros com base 2 (2 x = 1, 2, 4, 8, . . . ), isto nãoimplica que o mapeamento da textura seja quadrado, mas um valor não 2 x provovará que o mapeamento sejaimplicitamente <strong>de</strong>sabilitado.O argumento bor<strong>de</strong>r especifica a largura da borda à volta da textura. Esta borda permite acrescentartexels adicionais à textura.Os argumentos format, type, têm o mesmo objectivo que quando utilizados na função glDrawPixels. Oargumento pixels contêm a informação da imagem propriamente dita.Para aplicarmos textura à nossa geometria temos que activar o seu estado apropriado. Para tal utilizamosas funções glEnable/glDisable com as constantes GL TEXTURE 1D, GL TEXTURE 2D e GL TEXTURE 3D 2 , comoilustra o exemplo:glDisable ( GL2 . GL_TEXTURE_1D );glEnable ( GL2 . GL_TEXTURE_2D );8.1.1 Pipeline do Carregamento <strong>de</strong> ImagensO carregamento <strong>de</strong> imagens no OpenGL (por ex.: utilizando glTexImage) obe<strong>de</strong>ce a um pipeline <strong>de</strong> processamentoà semelhança do pipeline <strong>de</strong> transformações do OpenGL.As operações <strong>de</strong> convolução, pixel zoom, pixel packing, . . . (discutidas no capítulo anterior) são aplicadassegundo a Figura 8.2.8.1.2 Utilizando o Color BufferÉ possível carregar texturas 1D e 2D a partir do color buffer, utilizando as seguintes funções:glCopyTexImage1D (int target , int level , int internalformat ,int x, int y, int width ,int bor<strong>de</strong>r);1 Para verificar se foi bem sucedido utiliza-se a função glGetTexParameter2 É boa i<strong>de</strong>ia <strong>de</strong>sactivar os estados não utilizados, uma vez que apenas um <strong>de</strong>stes estados po<strong>de</strong> existir em simultâneo79
Figura 8.2: Pipeline - Carregamento <strong>de</strong> ImagensglCopyTexImage2D (int target , int level , int internalformat ,int x, int y, int width , int height ,int bor<strong>de</strong>r);O significado dos argumentos é semelhante aos argumentos da função glTexImage, mas neste caso o x, y,width e height especificam a área no color buffer a ler. O source buffer po<strong>de</strong> ser <strong>de</strong>finido utilizando a funçãoglReadBuffer.8.1.3 Actualização <strong>de</strong> TexturasO carregamento repetido <strong>de</strong> texturas po<strong>de</strong> ser dispendioso em termos <strong>de</strong> processamento. Substituir uma<strong>de</strong>terminada textura po<strong>de</strong> ser mais rápido, na maior parte das vezes do que o carregamento utilizando glTexImage.Para tal utilizamos as funções:glTexSubImage1D (int target , int level ,int xoffset ,int width ,int format , int type , Buffer data);glTexSubImage2D (int target , int level ,int xoffset , int yoffset ,int width , int height ,int format , int type , Buffer data);glTexSubImage3D (int target , int level ,int xoffset , int yoffset , int zoffset ,int width , int height , int <strong>de</strong>pth ,int format , int type , Buffer data);Mais uma vez, os argumentos são semelhantes aos utilizados em glTexImage. O xoffset, yoffset e zoffsetespecificam o local na textura actual para começar a fazer a substituição. O tamanho da textura no argumentodata é especificado pelos argumentos width, height e <strong>de</strong>pth.Finalmente um conjunto final <strong>de</strong> funções permite-nos substituir uma parte <strong>de</strong> uma textura utilizandoinformação extraída directamente do color buffer:glCopyTexSubImage1D (int target , int level ,int xoffset ,int x, GLint y,int width);glCopyTexSubImage2D (int target , int level ,int xoffset , int yoffset ,80