Conheça a iniciativa da Biblioteca dos Desenvolvedores  
Índice da Biblioteca  
Área dos Usuários  
Fórum de Discussão  
Forúm
 
  36 - Trabalhando com cores em OpenGL

Agora que entendemos como funciona o sistema de coordenadas, iremos entender como manipular cores no OpenGL.
O sistema de cores da OpenGL é muito parecido com o sistema de coordenadas.

Todas as cores vão de 0.0 até 1.0
Mais todas as cores são representadas no Padrão RGB com 255 cores.

Se você entendeu o tutorial anterior, vai deduzir também que 1.0 é o limite de cores ( igual a 255 ).

Sabendo disto, vamos brincar um pouco com as cores e aprender como desenhar um quadrado usando o tipo GL_QUADS

O programa abaixo em AllegroGL, imprime um quadrado Amarelo:

 


CÓDIGO...
// Exemplo de código que imprime um quadrado usando Allegro e AllegroGL
// Autor: Adriano Waltrick
// BDJogos
// Data: 01/10/2007

#include <allegro.h>
#include <alleggl.h>

int main()
{
   // Iniciações básicas da Allegro
   allegro_init();
   install_keyboard();
   
   // Iniciação da AllegroGL
   install_allegro_gl();
   allegro_gl_set(AGL_Z_DEPTH, 8);
   allegro_gl_set(AGL_COLOR_DEPTH, 16);
   allegro_gl_set(AGL_SUGGEST, AGL_Z_DEPTH | AGL_COLOR_DEPTH);
   // Setando o Modo Gráfico
   set_gfx_mode(GFX_OPENGL_WINDOWED, 640, 480, 0, 0);
   
   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
   
   glColor3d(1,0,0);
   
   // Iniciando a camera
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glFrustum(-1.0, 1.0, -1.0, 1.0, 1, 60.0);
   
   glLoadIdentity();
   
   // Colocando a cor
   glColor3d( 255, 255, 0 );
   
   // Iniciando nosso Quadrado
   glBegin(GL_QUADS);               
   glVertex3f( 0.0f, 0.0f, 0.0f);      
   glVertex3f( 0.0f, 1.0f, 0.0f);            
   glVertex3f( 1.0f, 1.0f, 0.0f);
   glVertex3f( 1.0f, 0.0f, 0.0f);      
   glEnd();
   
   
   allegro_gl_flip();
   
   // Laço principal
   while( !key[KEY_ESC] )
   {
      //Código
   }
   
   
   allegro_exit();
   
   return 0;
}
END_OF_MAIN();

FIM DE CÓDIGO...



Bom, já conhecemos os parâmetros para o glBegin GL_POINTS, GL_TRIANGLES e agora GL_QUADS.

Estamos vendo um por um com calma para que a gente possa se acostumar com eles.

Primeiro, você deve ter se assustado por que eu falei que deveriamos usar o sistema 0.0 e 1.0 para determinar as cores,
mais mesmo assim eu usei o sistema padrão de RGB( 255, 255, 255 ).

O que acontece é que o próprio OpenGL faz a conversão internamente ( na definição das vértices não ).
Mais se você passar os parâmetros glColor3d( 1.0, 1.0, 0.0 ); vai ter os mesmos resultados.


O GL_QUADS é muito especial por que, ele mostra como os pontos devem ser definidos para o OpenGL.

Teste o programa acima, invertendo a ordem dos pontos para a seguinte ordem:
  
   
// invertendo o primeiro pelo segundo
   glVertex3f( 0.0f, 1.0f, 0.0f);            
   glVertex3f( 0.0f, 0.0f, 0.0f);      
   glVertex3f( 1.0f, 1.0f, 0.0f);
   glVertex3f( 1.0f, 0.0f, 0.0f);  

Resultado:

 

O quadrado ficará cortado, por que a forma de renderizar os pontos é feita de ponto por ponto.
Invertendo a ordem do primeiro ponto para o segundo, ao tentar montar a imagem o OpenGL acaba cortando a parte de cima da figura.

Temos que ter muito cuidado com esse tipo de coisa.

Quando definimos uma cor fora do glBegin, a cor é utilizada por todas as vértices.
Nós também podemos definir cor para cada uma das vértices separadamente.

Exemplo com Glut para não perder a prática, baseado no exemplo acima.
O único código novo foi inserido na função display, vamos treinar ler sempre códigos em AllegroGL e Glut.


CÓDIGO...

// Exemplo de código de cores usando GLUT
// Autor: Adriano Waltrick
// BDJogos
// Data: 01/10/2007

#include <GL/glut.h>
#include <stdlib.h>

// Prototipos das funções que serão chamadas pela Glut ( Callback )
static void display(void);
static void key(unsigned char key, int x, int y);
static void idle(void);
static void resize(int width, int height);

// Main padrão, o programa inicia aqui
int main(int argc, char *argv[])
{
   glutInit(&argc, argv);
   glutInitWindowSize(640,480);
   glutInitWindowPosition(10,10);
   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
   
   glutCreateWindow("Programa Base");
   
   // callbacks
   glutReshapeFunc(resize);
   glutDisplayFunc(display);
   glutKeyboardFunc(key);
   glutIdleFunc(idle);
   
   
   glClearColor(0,0,0,0);
   glutMainLoop();
   
   return EXIT_SUCCESS;
}

// Função que é chamada quando a janela é redimencionada
static void resize(int width, int height)
{
   const float ar = (float) width / (float) height;
   
   glViewport(0, 0, width, height);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glFrustum(-ar, ar, -1.0, 1.0, 1.0, 60.0);
   
   glLoadIdentity() ;
}

// Função que é chamada quando for preciso mostrar ou atualizar a tela
static void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   
   glLoadIdentity();
   
   // Iniciando nosso Quadrado
   glBegin(GL_QUADS);
   
   glColor3d( 255, 255, 0 );       
   glVertex3f( 0.0f, 0.0f, 0.0f);
   glVertex3f( 0.0f, 1.0f, 0.0f);
   
   glColor3d( 0, 0, 0 );       
   glVertex3f( 1.0f, 1.0f, 0.0f);
   glVertex3f( 1.0f, 0.0f, 0.0f);
   
   glEnd();
   
   glutSwapBuffers();
}

// Função que é chamada quando uma tecla é apertada
static void key(unsigned char key, int x, int y)
{
   switch (key)
   {
      // caso aperte ESC
      case 27 :
      exit(0);
      break;
   }
   
   glutPostRedisplay();
}

// Função que executa rotinas padrões da Glut
static void idle(void)
{
   glutPostRedisplay();
}

FIM DE CÓDIGO...


O exemplo acima, definimos um amarelo para os 2 primeiros vértices e um preto para os 2 últimos criando um efeito degradê bem legal.

 

Podemos também, definir uma cor para cada vértice.. este conceito mais tarde vai ser muito importante para a gente, e é interessante brincar com isso também.

Exemplo em Glut


CÓDIGO...

// Exemplo de código de cores usando GLUT
// Autor: Adriano Waltrick
// BDJogos
// Data: 01/10/2007

#include <GL/glut.h>
#include <stdlib.h>

// Prototipos das funções que serão chamadas pela Glut ( Callback )
static void display(void);
static void key(unsigned char key, int x, int y);
static void idle(void);
static void resize(int width, int height);

// Main padrão, o programa inicia aqui
int main(int argc, char *argv[])
{
   glutInit(&argc, argv);
   glutInitWindowSize(640,480);
   glutInitWindowPosition(10,10);
   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
   
   glutCreateWindow("Programa Base");
   
   // callbacks
   glutReshapeFunc(resize);
   glutDisplayFunc(display);
   glutKeyboardFunc(key);
   glutIdleFunc(idle);
   
   
   glClearColor(0,0,0,0);
   glutMainLoop();
   
   return EXIT_SUCCESS;
}
   
// Função que é chamada quando a janela é redimencionada
static void resize(int width, int height)
{
   const float ar = (float) width / (float) height;
   
   glViewport(0, 0, width, height);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glFrustum(-ar, ar, -1.0, 1.0, 1.0, 60.0);
   
   glLoadIdentity() ;
}
   
// Função que é chamada quando for preciso mostrar ou atualizar a tela
static void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   
   glLoadIdentity();
   
   // Iniciando nosso Quadrado
   glBegin(GL_QUADS);
   
   // amarelo
   glColor3d( 255, 255, 0 );       
   glVertex3f( 0.0f, 0.0f, 0.0f);
   
   // verde
   glColor3d( 0, 255, 0 );       
   glVertex3f( 0.0f, 1.0f, 0.0f);
   
   // vermelho
   glColor3d( 255, 0, 0 );       
   glVertex3f( 1.0f, 1.0f, 0.0f);
   
   // azul
   glColor3d( 0, 0, 255 );
   glVertex3f( 1.0f, 0.0f, 0.0f);
   
   glEnd();
   
   glutSwapBuffers();
}
   
// Função que é chamada quando uma tecla é apertada
static void key(unsigned char key, int x, int y)
{
   switch (key)
   {
      // caso aperte ESC
      case 27 :
      exit(0);
      break;
   }
   
   glutPostRedisplay();
}
   
// Função que executa rotinas padrões da Glut
static void idle(void)
{
   glutPostRedisplay();
}

FIM DE CÓDIGO...

Resultado muito louco:


 


Download do exemplo 1 - Allegro - Clique Aqui

Download do exemplo 1 - Glut - Clique Aqui

Download do exemplo 2 - Glut - Clique Aqui



Contribuidor
Adriano Waltrick
01/10/2007


 

« Anterior

 

Próximo »

 
 

01/06/2007 (C) Copyright. Todos os Direitos Reservados. Leia a política de privacidade do portal.
É proibida a cópia de conteúdo deste site de acordo com a Lei Brasileira de Direitos Autorais.