24
 BCC-DCC-IM-UFBA 2011.2 OpenGL - Conceitos Básicos Prof. Antonio L. Apolinário Junior Roteiro ! O que é OpenGL ! Modelo de Programaçã o ! Primitivas de desenho ! Atributos de desenho ! Exercício

OpenGL Conceitos Basicos

Embed Size (px)

Citation preview

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 1/24

BCC-DCC-IM-UFBA 2011.2

OpenGL - Conceitos BásicosProf. Antonio L. Apolinário Junior

Roteiro

O que é OpenGL

✤ Modelo de Programação

✤ Primitivas de desenho

✤ Atributos de desenho

✤ Exercício

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 2/24

O que é OpenGL

O que é OpenGL

✤ Histórico:✤ Inicio da decada de 90:

✤ IRIS GL (I ntegrated Raster I maging S ystem Graphics Library)✤ Biblioteca Gráfica originalmente desenvolvida pela SGI para

seus sistema Irix

✤ incluía rotinas de eventos e janelas na API✤ PHIGS

✤ Biblioteca aberta e padroniza utilizada em sistemas Sun Microsystems, Hewlett-Packard e IBM

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 3/24

O que é OpenGL

✤ Histórico:✤ SGI propõe uma versão aberta da API da IrisGL

✤ OpenGL - Open Graphics Library

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

✤ Várias empresas✤ Gerenciam a API da OpenGL

 A API OpenGL

✤ ARB define a API✤ Cada empresa implementa a sua versão para o seu hardware

✤ drivers✤ API é composta de:

✤ Conjunto de funções padrão✤ Obrigatórias em qualquer implementação da biblioteca

✤ Conjunto de extensões✤ Implementa recursos específicos de um determinado hardware

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 4/24

 A API OpenGL

✤ As funções da API atuam apenas no processo de geração de pixels para o framebuffer

✤ Não possui funções para outros tratamentos vinculados ao ambientegráfico✤ Tratamento de janelas✤ Eventos✤ Objetos de interface gráfica (GUI)

Possui funções especificas para estabelecer a ligação entre a OpenGL eo ambiente gráfico subjacente✤ A API é Multiplataforma

 A API OpenGL

✤ Implementações:✤ Driver do fabricante da placa gráfica

✤ Driver do Sistema Operacional✤ Implementação em software

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

✤ Código aberto

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 5/24

Bibliotecas para OpenGL

✤ Bibliotecas são utilizadas para:✤ Acesso ao ambiente gráfico subjacente

✤ GLUT✤ Construção de Interfaces Gráficas com o usuário (GUI)

✤ GLUT / GLUI✤ QT

✤ Acesso as extensões:

✤ Glew✤ Construção de Grafos de Cena

✤ OpenSceneGraph✤ Outras....

 Arquitetura de uma aplicaçãoOpenGL

GLUT

GLU

GL

GLX, AGLor WGL

X, Win32, Mac O/S

software and/or hardware

application program

OpenGL Motif widget or similar 

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 6/24

Modelo de programação

Modelo de Programação

✤ Headers✤ #include <GL/gl.h>

✤ #include <GL/glu.h>✤ #include <GL/glut.h>

✤ Libraries

✤ Linux✤ -lGL –lGLU –lglut

✤ Win32✤ -lopengl32 –lglu32 –lglut32

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 7/24

Modelo de Programação

✤ Funções identificadas por prefixos:✤ OpenGL - gl e glu✤ Glut - glut

✤ Tipos “próprios”✤ mapeamento com os tipos do ambiente operacional✤ garantia de compatibilidade

✤ GLfloat, GLint, GLenum, …✤ Constantes

✤ Prefixo GL_ ou GLU_ 

Modelo de Programação

✤ Funções identificadas por prefixos:✤ OpenGL - gl e glu

✤ Glut - glut✤ Tipos “próprios”

✤ mapeamento com os tipos do ambiente operacional✤ garantia de compatibilidade

✤ GLfloat, GLint, GLenum, …

✤ Constantes✤ Prefixo GL_ ou GLU_ 

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 8/24

Modelo de Programação

✤ Hello World em OpenGL/GLUT#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;}

Criação da janela (GLUT)

Inicialização da Máquina de

Estados da OpenGL

(C/OpenGL)

Binding das

Call-Backs (GLUT)Definição da

Call-Back (C/OpenGL)

Funções GLUT

✤ Criação da janela:✤ funções GLUT

✤ glutInit(&argc, argv);✤ glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);✤ glutInitWindowSize (250, 250);✤ glutInitWindowPosition (100, 100);✤ glutCreateWindow ("hello");

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 9/24

Funções GLUT

✤ Binding dos eventos:✤ Definição das funções C que irão responder aos eventos do ambiente:

✤ Display✤ Reshape✤ Keyboard✤ Special Keyboard✤ Mouse

✤ Click ✤ Move

✤ Idle✤ Timer

Funções GLUT

✤ Loop de eventos:✤ Laço interno da biblioteca GLUT que:

✤ Monitora a fila de eventos da aplicação/janela✤ Dispara as call-backs associadas aos eventos

✤ void glutMainLoop(void);

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 10/24

Eventos GLUT

✤ Display

✤ Gerado sempre que a janela precisa ser (re)desenhada✤ Inicio da aplicação✤ Após mudança de tamanho

✤ Minimização/Maximização/resize✤ Função de Binding:

✤ void glutDisplayFunc(void (*func)(void));

✤ Pode ser forçado a ocorrer:✤ void glutPostRedisplay(void);

Eventos GLUT

✤ Reshape

✤ Gerado sempre que a janela muda de tamanho

✤ Inicio da aplicação✤ Após resize

✤ Função de Binding:✤ void glutReshapeFunc(void (*func)(int width, int height));

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 11/24

Eventos GLUT

✤ Idle

✤ Gerado sempre que a aplicação fica “ociosa”✤ Função de Binding:

✤ void glutIdleFunc(void (*func)(void));

Eventos GLUT

✤  Mouse

✤ Gerado sempre que um evento ligado ao mouse acontece

✤ Click✤  Move

✤ Funções de Binding:✤ void glutMouseFunc(void (*func)(int button, int state, int x, int y));

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

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 12/24

Eventos GLUT

✤  Mouse✤ Constantes indicam as informações o mouse:

✤ Qual botão:

✤ GLUT_LEFT_BUTTON,

✤ GLUT_ MIDDLE_BUTTON,

✤ GLUT_ RIGHT_BUTTON

✤ Status do botão:

✤ GLUT_ DOWN,

✤ GLUT_ UP

Eventos GLUT

✤ Teclado✤ Gerado sempre que um evento ligado ao teclado acontece

✤ Teclas alfanuméricas✤ Teclas “especiais”

✤ Funções de Binding:✤ void glutKeyboardFunc(void (*func)(unsigned int key, int x, int y); ✤ void glutSpecialFunc(void (*func)(int key, int x, int y);

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 13/24

Eventos GLUT

✤ Teclado✤ Constantes indicam as informações

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

✤ Função de Binding:✤ void glutTimerFunc(unsigned int msecs, void (*func)(int value), value); 

✤ msecs - limite inferior✤ value - permite a identificação de múltiplos timers

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 14/24

Call-backs típicas 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 típicas 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;}

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 15/24

Call-backs típicas 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 transição durante a troca do desenho no framebuffer

124816

124816

Front Back  

Displa

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 16/24

Primitivas de desenho

Primitivas de desenho emOpenGL

✤ Objetos Gráficos elementares✤ Pontos

✤ Linhas✤ Polígonos

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 17/24

Primitivas de desenho emOpenGL

✤ Tipos de primitivas suportadas:

Primitivas de desenho emOpenGL

✤ Processo de desenho, no modo direto, implica em:✤ Iniciar o desenho da primitiva

✤ void glBegin(GLenum mode);✤ Fornecer as coordenadas geométricas dos vértices da(s)

primitiva(s)✤ void glVertex{234}{sifd}[v](TYPE coords);

✤ Finalizar o desenho da primitiva✤ void glEnd(void);

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 18/24

Primitivas de desenho emOpenGL

✤ Vértices podem ser de vários tipos e dimensões:

glVertex3fv( v )

Number of 

components

2 - (x,y)

3 - (x,y,z)

4 - (x,y,z,w)

Data Type

  b - byte

ub - unsigned byte

s - short

us - unsigned short

i - int

ui - unsigned int

f - float

d - double

Vector 

omit “v” forscalar form 

glVertex2f( x, y )

Primitivas de desenho emOpenGL

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

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 19/24

 Atributos de desenho

Máquina de Estados OpenGL

✤ OpenGL funciona como uma máquina de estados✤ eventos modificam seu estado✤ o resultado do processamento é dependente do estado da máquina

✤ Todos os atributos de renderização são encapsulados na máquina de estado OpenGL✤ Estilo de rendering

✤ cor✤ tipo de linha✤ tamanho dos pontos✤ método de preenchimento de polígonos

✤ shading

✤ lighting

✤ texture mapping

✤ Etc…

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 20/24

Máquina de Estados OpenGL

✤ A aparência das primitivas é controlada pelo estado corrente

  for each ( primitive to render ) {

update OpenGL state

render primitive

}

✤ Funções de manipulação dos atributos de um vértice✤ glColor*()

✤ glNormal*()✤ glTexCoord*()

Máquina de Estados OpenGL

✤ Funções que definem o estado da primitiva:✤ glPointSize( size );

✤ glLineStipple( repeat, pattern );✤ glShadeModel( GL_SMOOTH );

✤ Funções que habilitando features:✤ glEnable( GL_LIGHTING );✤ glDisable( GL_TEXTURE_2D );

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 21/24

Modificando atributos

✤ Pontos✤ void glPointSize(GLfloat size);

✤ Linhas✤ void glLineWidth(GLfloat width);✤ void glLineStipple(GLint factor, GLushort pattern); ✤ glEnable(GL_LINE_STIPPLE);

Modificando atributos

✤ Polígonos:✤ 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

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 22/24

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 funções básicas:✤ void glOrtho2D(GLdouble left, GLdouble right,! ! ! ! ! !

GLdouble bottom, GLdouble top);✤ void glViewport(!GLint x, GLint y, GLsizei width,! ! ! GLsizei height);

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 23/24

Exercício

Exercício

✤ Desenvolver uma versão simplificada de jogo paredão:

5/10/2018 OpenGL Conceitos Basicos - slidepdf.com

http://slidepdf.com/reader/full/opengl-conceitos-basicos 24/24

Exercício

✤ Etapas:

1. Desenhar✤ Uma barra azul na base da tela✤ Um “muro” de quadrados de dimensão 5x30 (linhasxcolunas)

✤ cores diferentes (a sua escolha)

2. Permita mover a barra azul com as setas do teclado para a esquerda epara a direita

3. Ao pressionar a barra de espaço “dispare” um projetil do centro da barra na direção vertical✤ Caso ele bata em um dos quadrados do muro apaga-lo do paredão