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
Recommended