41
1 Introdução a OpenGL (parte final)

1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

Embed Size (px)

Citation preview

Page 1: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

1

Introdução a OpenGL

(parte final)

Page 3: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

3

Tipos de dados

• OpenGL possui seus próprios tipos de dados.

Tipo de dado OpenGL Representação Interna

Tipo de Dado C Sufixo

GLbyte 8-bit integer signed char b

GLshort 16-bit integer short s

GLint, GLsizei 32-bit integer int ou long i

GLfloat, GLclampf 32-bit floating-point float f

GLdouble, GLclampd 64-bit floating-point double d

GLubyte, GLboolean 8-bit unsigned integer unsigned char ub

GLushort 16-bit unsigned integer unsigned short us

GLuint, GLenum, GLbitfield

32-bit unsigned integer

unsigned long ou unsigned int ui

Page 4: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

4

Primitivos gráficos OpenGL

• Os primitivos são grafados da forma<prefixo da biblioteca><Raiz><Número de

argumentos(opcional)><Tipo de argumentos(opcional)>

• Como exemplo considere-se a função glVertex3f, onde Vertex é sua raiz, gl indica de qual biblioteca a função faz parte e 3f significa que a função recebe três valores de ponto flutuante(f) como parâmetro. Isso vale para todas as funções OpenGL.

Page 5: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

5

Conteúdo de um programa OpenGL• Um programa OpenGL deve conter          

– Montagem do contexto– Função de renderização (especificar nome)

• glutDisplayFunc– Função de “Reshape”(especificar nome)

• glutReshapeFunc

– Função principal que chama os demais e pode conter a animação

– Função laço de processamento (faz os “callbacks”)

Page 6: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

6

Montagem do Contexto

Page 7: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

7

Montagem do contexto– Criação de janela, englobando tamanho e posição– Modo de exibição (um ou dois buffers) – Habilitação do teste de profundidade – Habilitação da não exibição de superfícies ocultas– Limpeza de cores– Definição de cor de objetos– Limpeza de buffer – Configuração dos pixels– Habilitação de textura– Limpeza de fila de comandos ou troca de “buffers”– Modelo de sombreamento– Sentido de orientação da numeração de nós– Habilitação de periféricos de entrada

Page 8: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

8

Como se configuram as opções

• Funções– glEnable, glDisable, – glCullMode, glPolygonMode, glLightModel,

etc.

Page 9: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

9

Renderização

Page 10: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

10

Como renderizar um primitivo geométrico

• Transferência para o “framebuffer”

• Renderizar primitivos OpenGL– Definir um grupo de um ou mais vértices– Um vértice define:

• Um ponto

• Uma extremidade de uma aresta

• Uma quina de polígono aonde duas arestas se encontram

Page 11: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

11

Desenho com OpenGL

• Para desenhar um primitivo chamar glBegin()

• glEnd() fecha uma lista de vértices e seus atributos

• As coordenadas de um primitivo são fornecidas em ordem anti-horária

Page 12: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

12

Chamadas de função para desenhar um primitivo

glBegin(GL_POINTS);

glVertex3f(0.0f, 0.0f, 0.0f);

glEnd();

Page 13: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

13

Desenho de um triângulo:

glBegin(GL_TRIANGLES);glVertex3f(0.0f, 1.0f, 0.0f);glVertex3f(-1.0f, -1.0f, 0.0f);glVertex3f(1.0f, -1.0f, 0.0f);

glEnd();

Page 14: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

14

Desenho de um triângulo com cores diferentes em cada vérticeglBegin(GL_TRIANGLES);

glColor3f(1.0f, 0.0f, 0.0f); //vermelho puroglVertex3f(0.0f, 1.0f, 0.0f);

glColor3f(0.0f, 1.0f, 0.0f); //verde puroglVertex3f(-1.0f, -1.0f, 0.0f);

glColor3f(0.0f, 0.0f, 1.0f); //azul puroglVertex3f(1.0f, -1.0f, 0.0f);

glEnd();

Page 15: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

15

Renderização OpenGL

• Os dados consistem de – Coordenadas posicionais– Cores– Normais– Coordenadas de Textura

• Os vértices são processados – De maneira independente– Em ordem determinada

Page 16: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

16

Tipos de Renderização

• “Wireframe”– Mostra apenas linhas e curvas– Os objetos não são preenchidos

• Sombreamento plano– Cálculo de uma só cor para cada polígono– Preenche cada polígono com a cor constante

Page 17: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

17

Tipos de renderização

• Suave (sombreamento de Gouraud) – Interpola cor dos vértices ao longo dos polígonos– As cores dos vértices podem ser computadas por

cálculo de iluminação ou especificadas de forma explícita

• Mapeamento de Textura– Modificação da cor de cada Pixel com cores obtidas a

partir de uma imagem

Page 18: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

18

Transformações e Matrizes• As transformações de coordenadas são feitas por

matrizes• São usados como sistemas de coordenadas:

– Coordenadas do mundo• Aplicar matriz modelview

– Coordenadas do olho• Aplicar matriz projection

– Coordenadas do volume de visualização• Aplicar matriz de perspectiva

– Coordenadas normalizadas do dispositivo• Aplicar transformação de viewport

– Coordenadas da janela

Page 19: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

19

Transformações e Matrizes• As transformações de coordenadas mudam o

sistema de coordenadas.• As coordenadas dos objetos, pontos de iluminação

ou de observação serão definidas em coordenadas locais depois da mudança do sistema de coordenadas.

• A transformação de coordenadas é feita multiplicando as coordenadas correntes pela(s) matriz(es) de transformação.

Page 20: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

20

Transformações e Matrizes

• Quando as transformações são para posicionar os objetos (desenhar) ou pontos de iluminação usa-se o modo chamado modelview (modo de renderização).

• Quando as transformações são para posicionar o observador usa-se o modo chamado projection (modo de rasterização).

Page 21: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

21

Pilhas de Matrizes

• OpenGL possui múltiplas pilhas de matrizes

• glPushMatrix empilha uma cópia da matriz corrente

• glPopMatrix desempilha para a matriz corrente

• Muito útil para figuras definidas de maneira hierárquica

Page 22: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

22

Transformações do ModeloglTranslatef(0.0f, 0.0f, -10.0f);glRotatef(45.0f, 0.0f, 1.0f, 0.0f);

glBegin(GL_TRIANGLES);glColor3f(1.0f, 0.0f, 0.0f); //vermelho puroglVertex3f(0.0f, 1.0f, 0.0f);

glColor3f(0.0f, 1.0f, 0.0f); //verde puroglVertex3f(-1.0f, -1.0f, 0.0f);

glColor3f(0.0f, 0.0f, 1.0f); //azul puroglVertex3f(1.0f, -1.0f, 0.0f);

glEnd();

Page 23: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

23

Rasterização (“Reshape”)

Page 24: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

24

Modos

• A geração dos objetos deve sempre utilizar o modo modelview.

• Uma vez definida a geometria do objeto deve-se utilizar o modo projection para a exibição

Page 25: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

25

Visualização em OpenGL

• A visualização se compõe de duas partes– Posicionamento do objeto pela Matriz de

Transformação modelview– Projeção de visualização pela Matriz de Transformação

projection– OpenGL suporta tanto as transformações de

visualização ortográficas quanto as de perspectiva– A câmera OpenGL está inicialmente na origem

apontando para a direção z– As transformações movem os objetos em relação à

câmera

Page 26: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

26

Matriz do Modelo de Visualização

• Posiciona os objetos em coordenadas do mundo

• Usualmente formada pela concatenação de transformações simples– glRotate(theta, x,y,z)– glTranslate(x,y,z)– glScale(x,y,z)

• A ordem das transformações é importante

Page 27: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

27

Visualização em OpenGL

• Projeção Ortográfica– Limites paralelos ao volume de visualização– Os objetos são cortados no paralelepípedo de visualização pois

existe uma região de visualização delimitada pelos planos de corte– glOrtho(left, right, bottom, top, front, back)

• Projeção em Perspectiva– glFrustum, gluPerspective– O volume de corte é um tronco de pirâmide

• Os planos de corte (próximo e distante) não devem ser muito afastados um do outro

• O plano de corte próximo não deve ficar muito junto ao olho (ou câmera)

Page 28: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

28

Posicionamento da Câmera

• Usar gluLookAt para especificar – Posição do olho

– Ponto “Look-at”

– Vetor “up”

• gluLookAt(10,10,10,1,2,3,0,0,1);– O olho está em (10,10,10)

– O ponto “Look at” está em (1,2,3)

– O vetor “Up” é (0,0,1)

• Usualmente isto se faz na matriz GL_PROJECTION e se combina com a matriz de perspectiva

Page 29: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

29

Exemplo completo de Visualização

//Primeiramente a ProjeçãoglMatrixMode( GL_PROJECCTION);glLoadIdentity();gluPerspective(60, 1, 1, 100);gluLookAt(10,10,10,1,2,3,0,0,1)

//Depois as transformações do objetoglMatrixMode(GL_MODELVIEW)glLoad Identity();glTranslate(1,1,1);glRotatef(90, 1,0,0);DrawObject();

Page 30: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

30

Laço de Processamento

Page 31: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

31

Laço de processamento do GLUT

A função glutMainLoop() dispara o laço de processamento do GLUT, sendo chamada uma única vez em um programa. Esta rotina nunca retorna, só encerrando a aplicação por meio de interrupção. É ela que dispara todas as demais rotinas. Ao detectar um evento é feito um “callback” se o tratamento desse evento tiver sido especificado na aplicação.

Page 32: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

32

Funções de “callback”

Page 33: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

33

Funções de “callback” GLUT

Finalidade Chamada Renderização glutDisplayFunc(nome da função) Redimensionamento de janela ou rasterização

glutReshapeFunc(nome da função)

Teclado (teclas usuais) glutKeyboardFunc(nome da função) Teclado (teclas especiais) glutSpecialFunc(nome da função) Mouse glutMouseFunc(nome da função) Espera glutIdleFunc(nome da função

Page 34: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

34

Exemplo de função de espera

void idle(void) { time += 0.05;

glutSetWindow(window); glutPostRedisplay();

}

Page 35: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

35

Lista das funções GL, GLU e GLUT

Page 36: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

36

Funções GL, GLU e GLUT

Documentação sobre estas funções pode ser encontrada em:

• http://pyopengl.sourceforge.net/documetation/manual/reference-GL.html

• http://pyopengl.sourceforge.net/documetation/manual/reference-GLU.html

• http://pyopengl.sourceforge.net/documetation/manual/reference-GLUT.html

Page 37: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

37

Funções GL, GLU e GLUT

• GL.htm

• GLU.htm

• GLUT.htm

Page 38: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

38

Exemplo em C++

Page 39: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

39

Exemplo em Delphi

Page 40: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

40

Exemplo em C++ Builder

Page 41: 1 Introdução a OpenGL (parte final). 2 Um tutorial de OpenGL, em língua portuguesa, pode ser encontrado no endereço

41

Exemplo em VB