Você está na página 1de 24

OpenGL - Conceitos Bsicos

Prof. Antonio L. Apolinrio Junior


BCC-DCC-IM-UFBA 2011.2

Roteiro

O que OpenGL Modelo de Programao Primitivas de desenho Atributos de desenho Exerccio

O que OpenGL

O que OpenGL

Histrico:

Inicio da decada de 90:

IRIS GL (Integrated Raster Imaging System Graphics Library)

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:

SGI prope uma verso aberta da API da IrisGL

OpenGL - Open Graphics Library Vrias empresas Gerenciam a API da OpenGL

Em 1992 criado o OpenGL architectural review board (OpenGL ARB)


A API OpenGL

ARB dene a API

Cada empresa implementa a sua verso para o seu hardware

drivers

API composta de:

Conjunto de funes padro

Obrigatrias em qualquer implementao da biblioteca Implementa recursos especcos de um determinado hardware

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

Tratamento de janelas Eventos Objetos de interface grca (GUI)

Possui funes especicas para estabelecer a ligao entre a OpenGL e o ambiente grco subjacente

A API Multiplataforma

A API OpenGL

Implementaes:

Driver do fabricante da placa grca Driver do Sistema Operacional Implementao em software

Mesa (http://www.mesa3d.org/)

Cdigo aberto

Bibliotecas para OpenGL

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

Construo de Grafos de Cena OpenSceneGraph Outras....

Arquitetura de uma aplicao OpenGL


application program
OpenGL Motif widget or similar

GLUT GLU GL

GLX, AGL or WGL

X, Win32, Mac O/S software and/or hardware

Modelo de programao

Modelo de Programao

Headers #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> Libraries

Linux -lGL lGLU lglut Win32 -lopengl32 lglu32 lglut32

Modelo de Programao

Funes identicadas por prexos:


OpenGL - gl e glu Glut - glut mapeamento com os tipos do ambiente operacional

Tipos prprios

garantia de compatibilidade GLfloat, GLint, GLenum, Constantes

Prexo GL_ ou GLU_

Modelo de Programao

Funes identicadas por prexos:


OpenGL - gl e glu Glut - glut mapeamento com os tipos do ambiente operacional

Tipos prprios

garantia de compatibilidade GLfloat, GLint, GLenum, Constantes

Prexo GL_ ou GLU_

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

Binding dos eventos:

Denio das funes C que iro responder aos eventos do ambiente:


Display Reshape Keyboard Special Keyboard Mouse


Click Move

Idle Timer

Funes GLUT

Loop de eventos:

Lao interno da biblioteca GLUT que:


Monitora a la de eventos da aplicao/janela

Dispara as call-backs associadas aos eventos void glutMainLoop(void);

Eventos GLUT

Display

Gerado sempre que a janela precisa ser (re)desenhada


Inicio da aplicao Aps mudana de tamanho

Minimizao/Maximizao/resize

Funo de Binding: void glutDisplayFunc(void (*func)(void)); Pode ser forado a ocorrer: void glutPostRedisplay(void);

Eventos GLUT

Reshape

Gerado sempre que a janela muda de tamanho


Inicio da aplicao Aps resize


void glutReshapeFunc(void (*func)(int width, int height));

Funo de Binding:

Eventos GLUT

Idle

Gerado sempre que a aplicao ca ociosa Funo de Binding: void glutIdleFunc(void (*func)(void));

Eventos GLUT

Mouse

Gerado sempre que um evento ligado ao mouse acontece


Click Move
void glutMouseFunc(void (*func)(int button, int state, int x, int y));

Funes de Binding:

void glutMotionFunc(void (*func)(int x, int y));

Eventos GLUT

Mouse

Constantes indicam as informaes o mouse:

Qual boto:

GLUT_LEFT_BUTTON, GLUT_ MIDDLE_BUTTON, GLUT_ RIGHT_BUTTON GLUT_ DOWN, GLUT_ UP

Status do boto:

Eventos GLUT

Teclado

Gerado sempre que um evento ligado ao teclado acontece


Teclas alfanumricas Teclas especiais


void glutKeyboardFunc(void (*func)(unsigned int key, int x, int y);

Funes de Binding:

void glutSpecialFunc(void (*func)(int key, int x, int y);

Eventos GLUT

Teclado

Constantes indicam as informaes das teclas especiais:


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

Gera um evento baseado em um intervalo de tempo


S dispara uma vez tempo em milisegundos


void glutTimerFunc(unsigned int msecs, void (*func)(int value), value);

Funo de Binding:

msecs - limite inferior value - permite a identicao de mltiplos timers

Call-backs tpicas em GLUT

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; }

Call-backs tpicas em GLUT

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();

! !

! !

int main(int argc, char** argv) { . . . . glutKeyboardFunc(key); glutSpecialFunc(specialKey); glutMainLoop(); return 0; }

Call-backs tpicas em GLUT

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

Reduz o efeito de transio durante a troca do desenho no framebuffer

Front

16

16

Back

Displa

Primitivas de desenho

Primitivas de desenho em OpenGL

Objetos Grcos elementares


Pontos Linhas Polgonos

Primitivas de desenho em OpenGL

Tipos de primitivas suportadas:

Primitivas de desenho em OpenGL

Processo de desenho, no modo direto, implica em:

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);

Primitivas de desenho em OpenGL

Vrtices podem ser de vrios tipos e dimenses:

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 )

Primitivas de desenho em OpenGL

Exemplo de processo de desenho:

void drawSomthing( GLfloat color[] ){

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

Mquina de Estados OpenGL

OpenGL funciona como uma mquina de estados


eventos modicam seu estado o resultado do processamento dependente do estado da mquina Estilo de rendering

Todos os atributos de renderizao so encapsulados na mquina de estado OpenGL

cor tipo de linha tamanho dos pontos mtodo de preenchimento de polgonos

shading lighting texture mapping Etc

Mquina de Estados OpenGL

A aparncia das primitivas controlada pelo estado corrente for each ( primitive to render ) { update OpenGL state render primitive }

Funes de manipulao dos atributos de um vrtice glColor*() glNormal*() glTexCoord*()

Mquina de Estados OpenGL

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

Pontos void glPointSize(GLfloat size); Linhas void glLineWidth(GLfloat width);

void glLineStipple(GLint factor, GLushort pattern);

glEnable(GL_LINE_STIPPLE);

Modificando atributos

Polgonos: void glPolygonMode(GLenum face, GLenum mode); Face : GL_FRONT, GL_BACK, GL_FRONT_AND_BACK

Mode : GL_POINT, GL_LINE, GL_FILL

void glShadeModel (GLenum mode);

Mode : GL_FLAT , GL_SMOOTH

Definindo a rea de desenho

Mapeamento das coordenadas do mundo em coordenadas de Tela

Coordenadas Reais -> Coordenadas Inteiras

Definindo a rea de desenho

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

Desenvolver uma verso simplicada de jogo paredo:

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

Caso ele bata em um dos quadrados do muro apaga-lo do paredo

Você também pode gostar