Escolar Documentos
Profissional Documentos
Cultura Documentos
Adaptao: Autoria: Joo Paulo Pereira Antnio Costa Claudio Esperana Paulo Roma Cavalcanti
OpenGL O que ?
Uma API para gerao de grficos
3D e 2D Primitivas vectoriais e matriciais (imagens) Capaz de gerar imagens de alta qualidade Geralmente implementado de forma a tirar partido da acelerao grfica (se disponvel) Independente de plataforma Independente de sistema de janelas
12/4/2007 2
Sistemas de Janela
Principal meio de interaco humano-mquina em ambientes de computao modernos Ecr dividido em janelas (eventualmente sobrepostas) Janelas so controladas por aplicaes que tm a incumbncia de as manter sempre actualizadas Interaco do utilizador e do prprio sistema de janelas comunicada aplicao atravs de eventos. Ex.: Rato foi activado Janela foi redimensionada Eventos so tratados por rotinas callback da aplicao. Ex.: Redesenhar o contedo da janela Mover um objecto de um lado para outro da janela Cada Sistema de Janelas possui uma API distinta MS Windows, X-Windows, Apple Portabilidade: Camada de interface com diversos SJ mas com API nica (ex.: GLUT)
12/4/2007 3
Arquitectura do OpenGL
Avaliador Polinomial
CPU
Listas de Display
Rasterizao
Frame Buffer
Memria de Textura
APIs Relacionadas
GLU (OpenGL Utility Library)
Parte do padro OpenGL NURBS, trianguladores, qudricas, etc.
Cabealhos
}
/* Outras rotinas callback */
Rotinas callback
glutMainLoop(); return 0; }
12/4/2007
Cabealhos OpenGL/GLUT
#include <GL/glut.h> J inclui automaticamente os cabealhos do OpenGL:
#include <GL/gl.h> #include <GL/glu.h>
Se GLUT no for usado, os cabealhos OpenGL tm que ser includos explicitamente, juntamente com os de outra camada de interface H APIs para construo de interfaces grficas (GUI), construdas sobre o GLUT, cujos cabealhos incluem os do GLUT Por exemplo, o GLUI requer:
#include <GL/glui.h> J inclui glut.h
12/4/2007
Por exemplo, para registar uma callback de desenho chamada Desenho, usa-se
glutDisplayFunc (Desenho);
12/4/2007 9
janela ou parte dela necessita de ser redesenhada (ex.: janela estava por trs de uma outra que foi fechada) Um programa GLUT precisa ter uma! Exemplo:
void display ( void ) { glClear( GL_COLOR_BUFFER_BIT ); glBegin( GL_TRIANGLE_STRIP ); glVertex3fv( v[0] ); glVertex3fv( v[1] ); glVertex3fv( v[2] ); glVertex3fv( v[3] ); glEnd(); glutSwapBuffers(); /* double-buffering! */ }
12/4/2007 10
Se uma rotina de redimensionamento no for especificada, o GLUT usa uma rotina de redimensionamento por omisso que se limita a ajustar o viewport de modo a usar toda a rea til da janela
12/4/2007 11
GLUT - Callbacks
Outras callbacks frequentemente usadas
void keyboard(unsigned char key, int x, int y)
Eventos de teclado
void mouse(int button, int state, int x, int y) void motion(int x, int y) void passiveMotion(int x, int y)
Eventos de rato
Vrias outras
12/4/2007
12
12/4/2007
13
Outras inicializaes
Aps a criao da janela costume configurar variveis de estado do OpenGL que no mudaro no decorrer do programa. Por exemplo:
Cor do fundo Tipo de sombreamento desejado
12/4/2007 15
12/4/2007
16
12/4/2007
18
Resultado do Exemplo
12/4/2007
19
glEnd (); Entre glBegin() e glEnd() apenas alguns comandos podem ser usados. Ex.:
glMaterial glNormal glTexCoord
Uma vez emitido um vrtice (glVertex), este desenhado com as propriedades (cor, material, normal, coordenadas de textura etc.) registadas nas variveis de estado correspondentes Concluso: Antes de emitir um vrtice, assegurar-se que cor, material, normal, etc. tm o valor certo
12/4/2007 20
v2 v3 v 5 v1 v4
GL_TRIANGLES
v2 v5
v1 v3 v4 v6 v2
v1
v6 v5 v2
v1
v6 v5
v1
v4
v3
v4
v3 v1
v4
GL_TRIANGLE_STRIP
GL_POLYGON GL_TRIANGLE_FAN
v2
v3 v5
GL_QUADS
v6
v2 v4 v1 v6 v7 v3 v5 v5
GL_QUAD_STRIP
v6
v4
v1
v5
v3 v4 v6
v1 v2
v2 v3 v4
12/4/2007
v v3 v2 8
21
Nmero de componentes
2 - (x,y) 3 - (x,y,z) 4 - (x,y,z,w)
Tipo de dado
b ub s us i ui f d byte unsigned byte short unsigned short int unsigned int float double
vector
omitir o v quando coords dadas uma a uma glVertex2f( x, y )
12/4/2007
23
Poly.
Per Vertex
CPU
DL Texture Pixel
Raster
Frag
FB
Blue
8 16
0 1 2 3 24 25 26 123 219 74
Display
12/4/2007
RGBA mode
24
Ligar pelo menos uma fonte de luz. Ex.: glEnable(GL_LIGHT0); Especificar propriedades da(s) fonte(s) de luz: glLight() Especificar propriedades de material de cada objecto: glMaterial() Especificar normais de cada face ou de cada vrtice: glNormal()
12/4/2007 25
12/4/2007
26