Escolar Documentos
Profissional Documentos
Cultura Documentos
Roteiro
O que OpenGL
O que OpenGL
Histrico:
Biblioteca Grca originalmente desenvolvida pela SGI para seus sistema Irix inclua rotinas de eventos e janelas na API Biblioteca aberta e padroniza utilizada em sistemas Sun Microsystems, Hewlett-Packard e IBM
PHIGS
O que OpenGL
Histrico:
A API OpenGL
drivers
Conjunto de extenses
A API OpenGL
As funes da API atuam apenas no processo de gerao de pixels para o framebuffer No possui funes para outros tratamentos vinculados ao ambiente grco
Possui funes especicas para estabelecer a ligao entre a OpenGL e o ambiente grco subjacente
A API Multiplataforma
A API OpenGL
Implementaes:
Mesa (http://www.mesa3d.org/)
Cdigo aberto
Bibliotecas so utilizadas para: Acesso ao ambiente grco subjacente GLUT Construo de Interfaces Grcas com o usurio (GUI) GLUT / GLUI QT Acesso as extenses: Glew
GLUT GLU GL
Modelo de programao
Modelo de Programao
Modelo de Programao
Tipos prprios
Modelo de Programao
Tipos prprios
Modelo de Programao
Hello World em OpenGL/GLUT Criao da janela (GLUT) Inicializao da Mquina de Estados da OpenGL (C/OpenGL) Binding das Call-Backs (GLUT) Denio da Call-Back (C/OpenGL)
#include <GL/glut.h> void display(void) { glClear (GL_COLOR_BUFFER_BIT); glFlush (); } void init (void) { glClearColor (0.0, 0.0, 0.0, 0.0); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (250, 250); glutInitWindowPosition (100, 100); glutCreateWindow ("hello"); init (); glutDisplayFunc(display); glutMainLoop(); return 0; }
Funes GLUT
Criao da janela:
funes GLUT glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (250, 250); glutInitWindowPosition (100, 100); glutCreateWindow ("hello");
Funes GLUT
Click Move
Idle Timer
Funes GLUT
Loop de eventos:
Eventos GLUT
Display
Minimizao/Maximizao/resize
Funo de Binding: void glutDisplayFunc(void (*func)(void)); Pode ser forado a ocorrer: void glutPostRedisplay(void);
Eventos GLUT
Reshape
Funo de Binding:
Eventos GLUT
Idle
Gerado sempre que a aplicao ca ociosa Funo de Binding: void glutIdleFunc(void (*func)(void));
Eventos GLUT
Mouse
Click Move
void glutMouseFunc(void (*func)(int button, int state, int x, int y));
Funes de Binding:
Eventos GLUT
Mouse
Qual boto:
Status do boto:
Eventos GLUT
Teclado
Funes de Binding:
Eventos GLUT
Teclado
GLUT_KEY_LEFT, GLUT_ KEY_UP, GLUT_ KEY_RIGHT, GLUT_ KEY_DOWN, GLUT_ KEY_PAGE_UP, GLUT_ KEY_PAGE_DOWN, GLUT_ KEY_HOME, GLUT_ KEY_END, GLUT_ KEY_INSERT,
GLUT_ KEY_NUM_LOCK, GLUT_ KEY_BEGIN, GLUT_ KEY_DELETE, GLUT_ KEY_F1, GLUT_ KEY_F2, ....
Eventos GLUT
Timer
Funo de Binding:
Tratamento de mouse:
#include <stdio.h> #include <GL/glut.h> . . . . . . . . void mouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: printf("mouse left\n"); break; case GLUT_MIDDLE_BUTTON: printf("mouse middle\n"); break; case GLUT_RIGHT_BUTTON: printf("mouse right\n"); break; } } int main(int argc, char** argv) { . . . . glutMouseFunc(mouse); glutMainLoop(); return 0; }
Tratamento de teclado:
#include <stdio.h> #include <GL/glut.h> . . . . . . . . void special (int key, int x, int y) { switch (key) { case GLUT_KEY_LEFT: printf("LEFT\n"); ! break; case GLUT_KEY_RIGHT: printf("RIGHT\n"); ! break; case GLUT_KEY_UP:! printf("UP\n"); ! break; case GLUT_KEY_DOWN:printf("DOWN\n"); ! break; case GLUT_KEY_PAGE_UP:printf("PGUP\n"); default:printf("OUTRAS\n"); break; } glutPostRedisplay(); } void keyboard (unsigned char key, int x, int y) { switch (key) { case 27: exit(0); default:printf ("Tecla => %c\n", key); break; } glutPostRedisplay();
! !
! !
Tratamento de desenho:
#include <GL/glut.h> void display(void) { glClear (GL_COLOR_BUFFER_BIT); glFlush (); } void init (void) { glClearColor (0.0, 0.0, 0.0, 0.0); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (250, 250); glutInitWindowPosition (100, 100); glutCreateWindow ("hello"); init (); glutDisplayFunc(display); glutMainLoop(); return 0; }
Double Buffering
Front
16
16
Back
Displa
Primitivas de desenho
Iniciar o desenho da primitiva void glBegin(GLenum mode); Fornecer as coordenadas geomtricas dos vrtices da(s) primitiva(s) void glVertex{234}{sifd}[v](TYPE coords); Finalizar o desenho da primitiva void glEnd(void);
glVertex3fv( v )
Number of components
2 - (x,y) 3 - (x,y,z) 4 - (x,y,z,w)
Data Type
b ub s us i ui f d byte unsigned byte short unsigned short int unsigned int float double
Vector
omit v for scalar form glVertex2f( x, y )
glBegin( GL_QUADS ); glColor3fv( color ); glVertex2f( 0.0, 0.0 ); glVertex2f( 1.0, 0.0 ); glVertex2f( 1.5, 1.118 ); glVertex2f( 0.5, 1.118 ); glEnd();
Atributos de desenho
eventos modicam seu estado o resultado do processamento dependente do estado da mquina Estilo de rendering
A aparncia das primitivas controlada pelo estado corrente for each ( primitive to render ) { update OpenGL state render primitive }
Funes que denem o estado da primitiva: glPointSize( size ); glLineStipple( repeat, pattern ); glShadeModel( GL_SMOOTH ); Funes que habilitando features: glEnable( GL_LIGHTING ); glDisable( GL_TEXTURE_2D );
Modificando atributos
glEnable(GL_LINE_STIPPLE);
Modificando atributos
Polgonos: void glPolygonMode(GLenum face, GLenum mode); Face : GL_FRONT, GL_BACK, GL_FRONT_AND_BACK
No caso 2D duas funes bsicas: void glOrtho2D(GLdouble left, GLdouble right, ! ! ! ! ! ! GLdouble bottom, GLdouble top); void glViewport(!GLint x, GLint y, GLsizei width, ! ! ! GLsizei height);
Exerccio
Exerccio
Exerccio
Etapas: 1. Desenhar
Uma barra azul na base da tela Um muro de quadrados de dimenso 5x30 (linhasxcolunas)
cores diferentes (a sua escolha) 2. Permita mover a barra azul com as setas do teclado para a esquerda e para a direita 3. Ao pressionar a barra de espao dispare um projetil do centro da barra na direo vertical