introdução a opengl · • pasta c:\dev-c++\lib contém os arquivos opengl32.def, glaux.def e...
TRANSCRIPT
Introdução a OpenGL
Profª. Alessandra Martins Coelho
março/ 2013
OpenGL• OpenGL é uma API gráfica que permite a
criação de imagens gráficas 2D e 3D, através da definição de objetos (2D/3D) por um conjunto de formas primitivas geométricas e rotinas para manipulação;
• consiste em cerca de 150 comandos distintos usados para especificar os objetos e operações necessárias para produzir aplicativos tridimensionais interativos.
OpenGL
• A API do OpenGL foi projetada para ser usada com C ou C++.
• Mesa implementação livre do OpenGL• Jogl - para Java
OpenGL• As especificações OpenGL não descrevem as
interações entre OpenGL e o sistema de janelas utilizado.
• O OpenGL foi projetado para ser independente do SO e do sistema de janelas.
• Para ser completamente independente, o OpenGL não oferece rotinas de display ou interface (pois precisam de E/S).
• GLUT (OpenGL ToolKit), FDL
OpenGL como máquina de estados
• Todos os estados ou modos habilitados nas aplicações têm efeito enquanto os mesmos estiverem ligados ou forem modificados
O “Pipeline” do OpenGL• A maior parte das implementações
OpenGL tem uma ordem de operações a serem executadas. Uma série de estágios de processos chamam o “pipeline” de renderização do OpenGL.
Ambiente OpenGL para desenvolvimento
• As bibliotecas do OpenGL são distribuídas como parte dos sistemas operacionais da Microsoft, porém as mesmas podem ser baixadas no site oficial do OpenGL : http://www.opengl.org.
• Disponíveis também para MacOS, Unix Solaris e Linux.
Instalando o OpenGL e GLUT no DEV-C++
• bibliotecas OpenGL http://www.opengl.org.• O ambiente Windows já deve conter as DLLs necessárias para
execução dos programas OpenGL. • Pasta System ou System32 do Windows - opengl32.dll e
glu32.dll. • a pasta C:\Dev-C++\Include\GL contém os arquivos gl.h, glaux.h
e glu.h• pasta C:\Dev-C++\Lib contém os arquivos opengl32.def,
glaux.def e glu32.def.
• Faça o download do arquivo glut-devc.zip e descompacte o mesmo;
• Mova o arquivo glut.h para a pasta GL do DevC++ (C:\Dev-C++\Include\GL);
• Mova os arquivos glut32.def e libglut.a para a pasta Lib do DevC++ (C:\Dev-C++\Lib);
• Mova o arquivo glut32.dll para a mesma pasta onde se encontram os arquivos opengl32.dll e glu32.dll (system)
Configure o compilador para utilização de OpenGL no menu Projeto, opções do Projeto, parâmetros, no campo linker as diretivas de ligação -lopengl32 –lglut32 –lglu32
Linux
• As bibliotecas necessárias para instalar:– apt-get install freeglut3 freeglut3-dbg
freeglut3-dev– apt-get install build-essential
• Como compilar:– gcc -lglut -lGLU -lGL <nome do programa.c>
-o <nome do programa.exe>• Como Rodar:
– ./nome do programa.exe
Estrutura Básica de Programas OpenGL
• declaração dos arquivos de header para o OpenGL;
• configurar e abrir a janela;• inicializar os estados no OpenGL;• registrar as funções de “callback”;• renderização;• redimensionamento;• entradas : teclado, mouse, etc.;• entrar no loop de processamento de eventos.
Estrutura Básica de Programas OpenGL
#include <GL/gl.h>#include <GL/glut.h>void main( int argc, char** argv ){
int mode = GLUT_DOUBLE | GLUT_RGB;glutInitDisplayMode( mode );glutInitWindowSize(400,350);glutInitWindowPosition(10,10);glutCreateWindow( argv[0] );init();glutDisplayFunc( display );glutReshapeFunc( resize );glutKeyboardFunc( key );glutIdleFunc( idle );glutMainLoop();
}
Estrutura Básica de Programas OpenGL
#include <GL/gl.h>#include <GL/glut.h>void main( int argc, char** argv ){
int mode = GLUT_DOUBLE | GLUT_RGB;glutInitDisplayMode( mode );glutInitWindowSize(400,350);glutInitWindowPosition(10,10);glutCreateWindow( argv[0] );init();glutDisplayFunc( display );glutReshapeFunc( resize );glutKeyboardFunc( key );glutIdleFunc( idle );glutMainLoop();
}
criar uma cenafora da tela para depois, rapidamente, colocá-la na janela de visualização
DOUBLE ou SINGLE
Estrutura Básica de Programas OpenGL
#include <GL/gl.h>#include <GL/glut.h>void main( int argc, char** argv ){
int mode = GLUT_DOUBLE | GLUT_RGB;glutInitDisplayMode( mode );glutInitWindowSize(400,350);glutInitWindowPosition(10,10);glutCreateWindow( argv[0] );init();glutDisplayFunc( display );glutReshapeFunc( resize );glutKeyboardFunc( key );glutIdleFunc( idle );glutMainLoop();
}
as cores são especificadasatravés do fornecimento de intensidades dos componentes red, green eblue separadas
RGB ou RGBA
Estrutura Básica de Programas OpenGL
#include <GL/gl.h>#include <GL/glut.h>void main( int argc, char** argv ){
int mode = GLUT_DOUBLE | GLUT_RGB;glutInitDisplayMode( mode );glutInitWindowSize(400,350);glutInitWindowPosition(10,10);glutCreateWindow( argv[0] );init();glutDisplayFunc( display );glutReshapeFunc( resize );glutKeyboardFunc( key );glutIdleFunc( idle );glutMainLoop();
}
Tamanho da janela a ser criada
Estrutura Básica de Programas OpenGL
#include <GL/gl.h>#include <GL/glut.h>void main( int argc, char** argv ){
int mode = GLUT_DOUBLE | GLUT_RGB;glutInitDisplayMode( mode );glutInitWindowSize(400,350);glutInitWindowPosition(10,10);glutCreateWindow( argv[0] );init();glutDisplayFunc( display );glutReshapeFunc( resize );glutKeyboardFunc( key );glutIdleFunc( idle );glutMainLoop();
}
Posição da janela na tela do computador
Estrutura Básica de Programas OpenGL
#include <GL/gl.h>#include <GL/glut.h>void main( int argc, char** argv ){
int mode = GLUT_DOUBLE | GLUT_RGB;glutInitDisplayMode(mod);glutInitWindowSize(400,350);glutInitWindowPosition(10,10);glutCreateWindow( “...” );init();glutDisplayFunc( display );glutReshapeFunc( resize );glutKeyboardFunc( key );glutIdleFunc( idle );glutMainLoop();
}
Neste momento serão inicializados quaisquer estados OpenGL, que serão executados na execução do programa
Estrutura Básica de Programas OpenGL
#include <GL/gl.h>#include <GL/glut.h>void main( int argc, char** argv ){
int mode = GLUT_DOUBLE | GLUT_RGB;glutInitDisplayMode(mod);glutInitWindowSize(400,350);glutInitWindowPosition(10,10);glutCreateWindow( “...” );init();glutDisplayFunc( display );glutReshapeFunc( resize );glutKeyboardFunc( key );glutIdleFunc( idle );glutMainLoop();
}
ações de callback qqr evento ocorrendo no sistema: -redimensionamento de janela;- entradas de usuários através de teclado, mouse, ou outro dispositivo de entrada;- ocorrência da animações.
diferentes tipos de ações de callback
• glutDisplayFunc() – chamada quando um pixel na janela necessita ser atualizado.
• glutReshapeFunc() – chamado quando a janela é redimensionada.
• glutKeyboardFunc() – chamada quando uma tecla do teclado é pressionada.
• glutMouseFunc() – chamada quando o usuário pressiona um botão do mouse.
• glutMotionFunc() - chamada quando o usuário movimenta o mouse enquanto mantém um botão do mesmo pressionado.
• glutPassiveMouseFunc() – chamado quando o mouse é movimentado, independente do estado dos botões.
• glutIdleFunc() – uma função de callback chamada quando nada está acontecendo. Muito útil para animações.
Estrutura Básica de Programas OpenGL
#include <GL/gl.h>#include <GL/glut.h>void main( int argc, char** argv ){
int mode = GLUT_DOUBLE | GLUT_RGB;glutInitDisplayMode( mode );glutInitWindowSize(400,350);glutInitWindowPosition(10,10);glutCreateWindow( argv[0] );init();glutDisplayFunc( display );glutReshapeFunc( resize );glutKeyboardFunc( key );glutIdleFunc( idle );glutMainLoop();
}
entrar em um processo de loop, o qualinterpreta os eventos e chamadas das rotinas especificadas como callback
Modeloint main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow("Introdução a OPENGL - Computação Gráfica - março/2013"); init(); glutDisplayFunc(desenha); glutReshapeFunc(resize); glutKeyboardFunc(keyInput); glutMainLoop(); return 0; }
Modelovoid desenha(void){ glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0, 0.0, 0.0);
.
.
. glFlush(); }
Modelovoid init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); }
Modelovoid resize(int w, int h){ glViewport(0, 0, (GLsizei)w, (GLsizei)h); // Set viewport size to be
entire OpenGL window. glMatrixMode(GL_PROJECTION); // Set matrix mode to projection. glLoadIdentity(); // Clear current projection matrix to identity. // Specify the orthographic (or perpendicular) projection, // i.e., define the viewing box. glOrtho(0.0, 100.0, 0.0, 100.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW); // Set matrix mode to modelview.
glLoadIdentity();}
Viewport: Definindo a área de desenho
• O viewport corresponde a uma região na janela realmente criada, onde o nosso desenho é exibido.
• Sempre que a janela muda de tamanho/forma, não é necessário mudar o desenho, apenas o viewport.
• Você também pode usar o viewport para aumentar ou diminuir o tamanho da imagem.
• Por padrão, o viewport do OpenGL ocupa toda a janela.
glViewport( x, y, GLsizei width, GLsizei height)
Modelo// uso do tecladovoid keyInput(unsigned char key, int x, int y){ switch(key) {
case 27: // Press escape to exit. exit(0); break; default: break; }}
Sintaxe de Comandos do OpenGL
• Todos os comandos utilizam-se do prefixo gl em letras minúsculas. Similarmente, OpenGL define constantes com as iniciais GL_, em letras maiúsculas, e usa um “underscore” para separar as palavras
• Ex: glColor3f(); GL_COLOR_BUFFER_BIT
Glvertex3fv(v)
Nº de Componentes2 – (x,y)3 – (x,y,z)4 – (x,y,z,w)
Tipo de dadosb – byteub – unsigned bytes – shortus – unsigned shorti – intui – unsigned intf – floatd – double
VetorOmite “v” para a forma escalar
Primitivas
glBegin(primitiva); glVertex3f(*,*,*);// v0
glVertex3f(*,*,*);//v1
... glVertex3f(*,*,*);//vn-1
glEnd();
• GL_POINTS – Desenha apenas pontos no plano.
• v0, v1, ..., vn-1
GL_POINTS
glColor3f (1.0, 0.0, 0.0); glPointSize(15); glBegin(GL_POINTS); glVertex2f(25,25); glVertex2f(25,75); glVertex2f(75,25); glVertex2f(75,75); glEnd();
GL_POINTS const float distancia = 5.0f; float y=50, pos = -1 + distancia; int i; for (i = 1; i <= 20; i ++) { glPointSize(i); glBegin(GL_POINTS); glVertex3f(pos, y, 0); glEnd(); pos += distancia; }
• GL_LINES – Desenha linhas independentes entre dois pontos
• v0v1, v2v3 ,..., vn-2
vn-1
GL_LINES glLineWidth(5.0); glBegin(GL_LINES); glColor3f(1.0, 0.0, 0.0);//
vermelho glVertex3f(20.0, 20.0, 0.0); glColor3f(0.0, 1.0, 0.0);//
verde glVertex3f(80, 20.0, 0.0); glEnd();
GL_POINTS
• você pode dizer quais os valores de cor devem estar no ponto médio (50,0, 20,0, 0,0) do segmento desenhado?
• verificar a sua resposta desenhando um ponto com os valores de cor um pouco acima do ponto médio.
• GL_LINE_STRIP – Liga todos os pontos (não fecha o circuito)
• v0v1, v2v3 ,..., vn-2
vn-1
• GL_LINE_LOOP – Liga todos os pontos (fecha o circuito)
• v0v1, v2v3 ,..., vn-2
vn-1, vn-1 v0
• GL_TRIANGLES – A cada três vértices forma um triângulo
• v0v1v2, v3v4v5 ,..., vn-3vn-2 vn-1
GL_TRIANGLES
glBegin(GL_TRIANGLES); glVertex2f(10,90); glVertex2f(10,10); glVertex2f(35,75); glVertex2f(30,20); glVertex2f(90,90); glVertex2f(80,40); glEnd();
• GL_TRIANGLE_STRIP - Liga uma série de triângulos, formando uma tira com os mesmos.
• v0v1v2, v1v3v2 , v2v3v4 , ...,vn-3vn-2
vn-1 (para n ímpar)• v0v1v2, v1v3v2 ,
v2v3v4 , ..., vn-3vn-1
vn-2 (para n par)
GL_TRIANGLE_STRIP glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glBegin(GL_TRIANGLE_STRIP); glVertex3f(10,90, 0); glVertex3f(10,10, 0); glVertex3f(35,75, 0); glVertex3f(30,20, 0); glVertex3f(90,90, 0); glVertex3f(80,40, 0); glEnd();
Exercício 1 • Usando GL_TRIANGLE_STRIP reproduza as figuras
abaixo:
• GL_TRIANGLE_FAN – A palavra "fan" significa “leque” em português. Ou seja, cria-se um leque no plano.
• v0v1v2, v0v2v3 , v0v3v4 , ..., v0vn-2 vn-1
GL_TRIANGLE_FAN
• GL_QUADS – A cada quatro vértices definidos, é desenhado um quadrado na tela.
• V0v1v3v2,v4v5v6v7,..
GL_QUADSglPolygonMode(GL_FRONT_AND
_BACK, GL_LINE); glBegin(GL_QUADS); glColor3f (0.0, 0.0, 1.0); glVertex3f(10,90,0); glVertex3f(10,10,0); glVertex3f(40,20,0); glVertex3f(35,75,0); glColor3f (0.0, 0.7, 1.0); glVertex3f(15,80,0); glVertex3f(20,10,0); glVertex3f(90,20,0); glVertex3f(90,75,0); glEnd();