Issuu on Google+

Tutorial Opengl (parte 4) Nesta quarta parte optei por não avançar muito, pois ainda faltam algumas coisas básicas que devem ser aprendidas quando se utiliza OpenGL. Conhecimento de como funciona a renderização em OpenGL é muito importante, principalmente quando se tenta otimizar o código. Imagine que queremos desenhar no canto da cena um sprite 2D com um marcador de pontos ... vamos lá, calculamos as coordenadas certinhas, colocamos a textura, desenhamos... mas e se queremos desenhar por exemplo uma sequência de letras, para criar um texto ? temos que fazer vários testes, incrementar uma fração certinha para as letras ficarem lado a lado, fora a largura e altura que podem não bater com o esperado =( Se queremos um caractere com 16x16 pixels seja desenhado com exatamente 16x16 pixels teríamos um trabalho enorme para coisa tão simples. Isso é por causa da projeção que estamos utilizando, que simula perspectiva para dar a impressão de profundidade, fazendo com que tenhamos que ajustar o nosso sprite 2D à esse tipo de projeção. Mas para a alegria de quem quer usar imagens 2D existe outra projeção em OpenGL chamada Ortogonal ! =D Esse tipo de projeção ortografica cria uma matriz que é paralela com o volume da visão, fazendo com que tudo projete em 2D !

A imagem acima ilustra a diferença entre projeção em perspectiva e ortogonal Para fazermos esse tipo de projeção, precisamos mudar o formato da matriz de projeção, e para criar a matriz ortogonal, usamos a função glOrtho: void glOrtho (double esquerda, double direita, double baixo, double cima, double min, double max);

Os parâmetros são bem simples, esquerda, direita, baixo e cima são as coordenadas mínimas e máximas que estarão visíveis, min e max informam o mínimo e o máximo visível de profundidade. Um exemplo da utilização dessa função é mostrado abaixo: // exemplo para gerar uma projeção ortogonal com 640x480 glMatrixMode (GL_PROJECTION); glLoadIdentity (); glOrtho (0, 640, 480, 0, -1, 1); // volta para a matriz de modelo glMatrixMode (GL_MODELVIEW);

Dessa forma, podemos usar glVertex2f com coordenadas inteiras para desenhar objetos 2D em qualquer parte da cena =)) O programa criado para ilustrar esse tutorial cria uma matriz ortogonal e desenha na tela 3 imagens, a primeira é um céu que cobre o fundo total, a segunda é uma bola com fundo transparente que fica se movendo por cima do fundo e a terceira é o nome Stigma29a. O interessante disso é que podemos ter várias imagens diferentes em uma textura só, e desenhar na tela apenas a que queremos sem ter que ficar mudando de textura para cada sprite. Podemos dessa forma criar uma textura com todos os caracteres e usá-lo como fonte para escrever na nossa cena. Existe um ótimo programa para gerar fontes no site da NeHe (http://nehe.gamedev.net) na parte de downloads. A textura gerada vai conter 16 fileiras de 16 caracteres cada. Cada caractere gerado vai conter 16x16 pixels, então para achar a coordenada de cada letra, dividimos o valor do caractere por 16 para achar a fileira e pegamos a sobra para achar a coluna. Como a textura em OpenGL vai de 0.0f até 1.0f, achamos a coordenada da letra dentro da textura multiplicando as posições da colune e fileira por uma fração que é 1.0f / 16.0f. O quadrado para desenhar o caractere vai ser de posx * fração até posx * fração + fracao para a horizontal e posy * fração até posy * fração + fracao para a vertical =) Exemplo: #define FRACAO 1.0f / 16.0f void DesenhaLetra (short x, short y, char letra) { float xtex, ytex; xtex = (letra % 16) * FRACAO; ytex = (letra / 16) * FRACAO; glBegin (GL_QUADS); glTexCoord2f (xtex, ytex); glVertex2f (x, y); // esquerda / cima glTexCoord2f (xtex + FRACAO, ytex); glVertex2f (x + 16.0f, y); // direita / cima glTexCoord2f (xtex + FRACAO, ytex + FRACAO); glVertex2f (x + 16.0f, y + 16.0f); // direita / baixo glTexCoord2f (xtex, ytex + FRACAO); glVertex2f (x, y + 16.0f); // esquerda / baixo }

glEnd (GL_QUADS);

void DesenhaTexto (short x, short y, char *texto, unsigned int tex) { glEnable (GL_TEXTURE_2D); glBindTexture (GL_TEXTURE_2D, tex); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

}

while (*texto) { DesenhaLetra (x, y, *texto); texto++; x += 16; // incrementa pos horizontal } glDisable (GL_BLEND); glDisable (GL_TEXTURE_2D);

Repare como as coordenadas são indicadas em valores inteiros como se estivessemos usando qualquer outra engine 2D =) Obrigado por ler esse tutorial, espero que tenha sido útil para você entender melhor como funciona o OpenGL. Se você utilizar o que foi ensinado aqui para criar um demo ou game, ou modificar e otimizar os códigos aqui mostrados, me envie por e-mail as mudanças com o código fonte que eu colocarei no site, ou se utilizar o Framework, pelo menos me dê os créditos =)) ! Mario - 29/12/2005 warriormario@hotmail.com Stigma29a


Tutorial - openGL