miniApp [1]
Oi.
Continuando com as miniapps, vamos discutir um modo para exibir Imagens. Usaremos texturas da opengl. Um simples tutorial pode ser encontrado no site do nehe. Contudo, abriremos uma imagem targa (tipo 2).
Criamos uma classe abstrata Image. Essa classe extende Drawable, tem um método para carregar uma imagem (loadImage) a partir de um path, e vários métodos para plotagem. Com esses métodos tem-se a opção de desenhar a imagem toda, ou uma subimagem, numa posição (x,y) qualquer, ou ainda desenhar a imagem ou sua subimagem, em uma posição relativa definida anteriormente – como a própria opengl faz.
Definimos uma classe derivada a partir da Image, chamada OpenglImage. Basicamente trata aspectos da textura em opengl. Ela tem, protegidos, os dados da imagem (image), o tamanho (width, height) o formato (format) e o tipo (type), esses dados são necessários para o método que usaremos na implementação. Os scalares, usados para todas as imagens – portanto static, estão aqui para manter o aspecto, a proporção, das imagens com relação às dimensões da tela em questão. Implementa as formas de plotar a imagem, mas não o modo de carregar – este é específico para cada formato. Em openGL cada textura tem um ID, que pode ser gerado por uma função da própria opengl.
O TargaImage extende a OpenglFormat e também o TargaFormat. O parpel dessa classe é simplesmente implementar o modo de abrir as imagens. Carrega os dados da imagem targa e seta as informações requeridas pelo OpenglFormat.
O TargaFormat já foi discutido nesse blog (nesse post). Serve apenas para obter os dados da imagem, simples assim.
Na miniApp declaramos uma imagem (OpenglImage) e criamos, no inicializador – método initialStartup, uma imagem TargaImage:
image = new myOpengl::TargaImage("exemplo.tga");
Então mandamos desenhar no método draw. Devemos ver a imagem exemplo.tga no centro da tela. Brinque à vontade com o exemplo. À bastante coisa que pode ser modificada. Por exemplo: Transparência – com o canal Alpha na imagem, pode-se “excluir” uma cor por exemplo, com bending, Cores – mude o imageData, trocando cores, posicionamento, tente abrir outro formato, tente “flipar” a imagem, tente aumentar o brilho… Várias coisas para “brincar”
Entendendo a textura do Opengl, a implementação da classe OpenglImage.
No construtor geramos um (apenas 1, poderia ser mais) id usando a função : glGenTextures(1,&textureId); Linkamos, assim, um id qualquer à variável textureId.
Fazemos uma ligação daquele id com um parâmetro da opengl glBindTexture(GL_TEXTURE_2D,textureId); O parâmetro quarda informações importantes. Setamos algumas configurações em GL_TEXTURE_2D.
Posicionamos a textura de acordo com os vértices do “retangulo”.
Na classe TargaImage, quando abrimos a imagem, usamos a função glTexImage2D para passar as informações – data, tamanho, formato, tipo…
Antes de desenhar, ligamos novamente o id ao parâmetro, então “desenhamos”, na verdade formamos um quadrado, no qual conterá a imagem.
Molezinha.
Ah! O BaseOpengl talvez esteja um pouco diferente dos outros posts para poder usar o canal alpha.
O projeto está no repositório: https://svn.inf.ufsc.br/matheus.zeroth/miniApp/exemplo2/
:p