introdução à opengl
DESCRIPTION
Aula sobre OpenGL para a disciplina de Introdução à Computação Gráfica do curso de Ciência da Computação da UFPB no período 2010.1TRANSCRIPT
Introdução à OpenGL
• Open Graphic Library (http://www.opengl.org)
• Biblioteca de rotinas gráficas de modelagens 2D e 3D, extremamente portável e rápida;
• Introduzida em 1992 pela Silicon Graphics;
– Conceber API gráfica independente do dispositivo de exibição
• Gerenciado por um consórcio formado pelas principais empresas da área:
– 3Dlabs, Apple, Nvidia, SGI e SUN;
– Frequentes revisões proporcionam a incorporação das mais recentes técnicase da evoluação do hardware;
• Todas as rotinas são implementadas em C/C++08/04/2010 2
Características
• Recursos gráficos:– Desenhos de primitivas:
• Pontos, Linhas e Polígonos;
– Iluminação;– Sombreamento;– Mapeamento de Texturas;– Transparência;
• Implementações de OpenGL:– opengl32.dll (Microsoft)– opengl.dll (SGI)– mesa3d (GNU)
08/04/2010 3
Restrições
• As funcionalidades fornecidas pela OpenGL são de baixo nível;
• Não fornecem funcionalidades e gerenciamento de janelas e tratamento de eventos.
• Solução:– Extensão da OpenGL através de novas bibliotecas– GLU (OpenGL Utility Library)
• Manipulação de matrizes;• Orientação da visualização;• Geração de superfícies quadráticas;
– GLUT (OpenGL Utility Toolkit)• Criação de janelas e menus• Gerenciamento de janelas e interações do usuário
08/04/2010 4
Programa Básico em OpenGL#include <GL/glut.h> // headers
void Desenha (void) { // rotinas
...
}
int main(int argc, char **argv)
{
glutInit(&argc,argv); // inicia a GLUT
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // define o modo de exibição
glutInitWindowSize(400,350); // tamanho da janela gráfica
glutInitWindowPosition(10,10); // define posição da janela
glutCreateWindow (“Quadrado"); // cria a janela gráfica
glutDisplayFunc(Desenha); // apresentação da cena
Inicializa(); // definir estado inicial da opengl
glutMainLoop(); // inicia o laço gráfico
}
08/04/2010 5
Cabeçalhos
#include <GL/glut.h>
• Já inclui automaticamente os headers da OpenGL:– #include <GL/gl.h>
– #include <GL/glu.h>
• Se a GLUT não for usada, os cabeçalhos da OpenGL tem que ser incluídos explicitamente.
08/04/2010 6
Estrutura do Main
• Inicialização da glut:glutInit(&argc, argv);
• Informar o modo do display a ser utilizado:glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
– GLUT_SINGLE• janela com buffer simples (todos os desenhos serão feitos
nessa janela)
– GLUT_RGB• sistema de cor utilizado será o RGB
08/04/2010 7
Estrutura do Main
• Definir tamanho, posição inicial e nome da janela criada:glutInitWindowSize (400, 350);
glutInitWindowPosition (10, 10);
glutCreateWindow (“Nome da Janela");
• Definir estado inicial do OpenGL:Inicializa();
void Inicializa(void)
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // cor de fundo da tela
glMatrixMode(GL_PROJECTION); // seleciona matriz de projeção
glLoadIdentity(); // lê a matriz de identidade
gluOrtho2D(0.0, 250.0, 0.0, 250.0); // projeção paralela
}
08/04/2010 8
Registrando Callbacks
• Callbacks são rotinas que serão chamadas para tratar eventos;
• Para uma rotina callback ser efetivamente chamada, ela precisar ser registrada através da função:glutXXFunc (callback);
– Onde XX designa uma classe de eventos;
– callback é o nome da rotina;
08/04/2010 9
Callback de desenho
• É a rotina chamada sempre que a janela precisa ser redesenhada;
glutDisplayFunc(Desenha);
void Desenha (void)
{
glClear(GL_COLOR_BUFFER_BIT); // limpa buffers
glColor3f(1.0f, 0.0f, 0.0f); // cor vermelha
glBegin(GL_QUADS); // inicio do desenho
glVertex2i(100,150);
glVertex2i(100,100);
glVertex2i(150,100);
glVertex2i(150,150);
glEnd(); // fim do desenho
glFlush(); // exibe o desenho na tela
}
08/04/2010 10
Resultado do Exemplo
08/04/2010 11
Primitivas de Desenho
• Parâmetros de glBegin():– GL_POINTS: cada vértice como simples ponto– GL_LINES: cada par de vértices forma uma reta– GL_LINE_STRIP: traça um grupo de segmentos do
primeiro ao último vértice– GL_LINE_LOOP: traça um grupo de segmentos do primeiro
ao último vértice, e retorna ao primeiro– GL_TRIANGLES: cada trio de vértices como sendo os
vértices de um triângulo– GL_QUADS: cada grupo de 04 vértices como sendo os
vértices de um quadrilátero– GL_POLYGON: grupo de vértices como sendo os vértices de
um polígono
08/04/2010 12
Primitivas de desenho
08/04/2010 13
Outros Callbacks
glutKeyboardFunc(keyborad);
– Eventos do teclado
glutSpecialFunc(special);
– Teclas especiais Home, End, PageDown, PageUp
glutMouseFunc(mouse);
– Interação com o muse
glutMotionFunc(motion);
– Movimentos do mouse
08/04/2010 14
Convenções de Nomes
glVertex3f(x, y);
Número de componentes
2 – (x, y)
3 – (x, y, z)
4 – (x, y, z, w)
Tipo de dado
b – byte
ub – unsigned byte
s – short
us – unsigned short
i – int
ui – unsigned int
f – float
d - double
08/04/2010 15
Exercícios
1. A partir do programa básico, implemente outras primitivas de desenho da OpenGL.
2. Implemente os algoritmos de traçado de linhas DDA e Bresenham, fazendo a comparação do tempo de execução de cada um para uma mesma reta.
08/04/2010 16