54
OpenGL OpenGL Alberto B. Raposo http://www.opengl.org

19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

  • Upload
    others

  • View
    15

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

OpenGLOpenGL

Alberto B. Raposo

http://www.opengl.org

Page 2: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

OpenGL: o que é?

• API– Interface para programador de aplicação

Aplicação

API abstrata

API

Hardware & Software

Dispositivo

de saída

Dispositivo

de entrada

Page 3: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Por que OpenGL?

• rápido• relativamente simples• arquitetura bem definida• bem documentado• independente de sistemas de janelas• primitivas geométricas e imagens• padrão

– disponível em diversas plataformas

Page 4: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Bibliotecas

• O OpenGL propriamente dito:– libGL.so ou opengl32.dll e opengl32.lib

– GL.h ou gl.h

• OpenGL Utility library (GLU): já vem com o OpenGL– libGLU.so ou glu32.dll e glu32.lib

– GLU.h ou glu.h

• O glut toolkit:

– libglut.a ou (glut32.dll e glut32.lib)

– glut.h

Page 5: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

OpenGL / GLU

• Aproximadamente 250 comandos e funções– 200 do core OpenGL– 50 da GLU – OpenGL Utility Library

• GLU– contém várias rotinas que utilizam os comandos

OpenGL de baixo nível para executar tarefascomo setar as matrizes para projeção e orientação da visualização, e fazer o rendering de uma superfície

• No Microsoft Visual C++#include <windows.h> #include <gl/gl.h> #include <gl/glu.h>

Page 6: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

GLUT

• GLUT - OpenGL Utility Toolkit– toolkit independente de plataforma– Por ser portável, OpenGL não possui funções

para gerenciamento de janelas, tratamento de eventos e manipulação de arquivos

• GLUT faz isso (criação de janelas e menus popup, gerenciamento de eventos de mouse e teclado, etc)

• http://www.opengl.org/resources/libraries/glut/

• http://www.xmission.com/~nate/glut.html

– criada para facilitar o aprendizado e a elaboraçãode programas OpenGL

– independente do ambiente de programação– pegar glut.dll e glut32.dll

Page 7: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Aplicação típica

Aplicação

Sistema de

Interface (GLUT) OpenGL

GLU

Hardware

Page 8: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Nomes de funções

• Todos os nomes das funções OpenGL seguem umaconvenção que indica de qual biblioteca a função fazparte e, freqüentemente, quantos e que tipos de argumentos a função tem. – <PrefixoBiblioteca> <ComandoRaiz>

<ContadorArgumentosOpcional> <TipoArgumentosOpcional>

• Exemplos:– glColor3f possui Color como raiz. O prefixo gl representa a

biblioteca gl, e o sufixo 3f significa que a função possui trêsvalores de ponto flutuante como parâmetro.

– Variações da função: recebe três valores inteiros comoparâmetro (glColor3i), três doubles (glColor3d) e assim pordiante.

– glVertex2f...

Page 9: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Primitivas geométricas básicas

Ponto Linha

Polígono

Triângulo

Quadrado

Page 10: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Objetos 3D

From SIGGRAPH’97 course

Page 11: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Imagem e Textura

Page 12: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Pipeline OpenGL

• Como uma aplicação faz chamadas às funções API OpenGL, oscomandos são colocados em um buffer de comandos. Este buffer épreenchido com comandos, vértices, dados de textura, etc. Quandoeste buffer é "esvaziado", os comandos e dados são passados para o próximo estágio

• Após a etapa de aplicação das transformações geométricas e dailuminação, é feita a rasterização, isto é, é gerada a imagem a partirdos dados geométricos, de cor e textura. A imagem final, então, écolocada no frame buffer, que é a memória do dispositivo gráfico. Istosignifica que a imagem é exibida no monitor .

http://www.inf.pucrs.br/~manssour/OpenGL

Page 13: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Pipeline de renderização

VérticesOperações

geométricas

Operações

sobre imagensImagens Textura

RasterizaçãoOperações

sobre

fragmentos

Frame

Buffer

Page 14: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados
Page 15: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Máquina de Estados

• OpenGL é uma máquina de estados. É possívelcolocá-la em vários estados (ou modos) que não sãoalterados, a menos que uma função seja chamadapara isto. – Ex.: a cor corrente é uma variável de estado que pode ser

definida como branco. Todos os objetos, então, sãodesenhados com a cor branca, até o momento em que outracor corrente é especificada.

– Outros exemplos de variáveis de estado: estilo (padrão) de linha, posições e características de luzes, propriedades de materiais de objetos que estão sendo desenhados, etc.

• Agrupar objetos por estados pode ser interessante para ganharperformance na etapa de renderização (i.e., envia-se objetoscom mesmos estados em seqüência para a GPU, diminuindoos comandos de troca de estados).

Page 16: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Maquina de Estados

• Trecho de programa a seguir mostraum exemplo da utilização dos estados.

Page 17: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Primeiro Exemplo

Define a função de desenho

“Título” da janela criada

Define modo de operação da GLUT

Page 18: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

glutInitDisplayMode

• Parâmetros– GLUT_SINGLE: usa apenas um buffer de cor. A função que

efetua exibição da imagem é glFlush

– GLUT_DOUBLE: usa 2 buffers de cor. Um (visível) armazena a imagem mostrada e outro (invisível) armazena a imagem que está sendo construída. Ao finalizar a construção da imagem, força-se a troca dos buffers com a função glutSwapBuffers

• Double buffering é bom para animações

– GLUT_DEPTH: define que se necessita do Z-buffer– GLUT_RGB/GLUT_RGBA: define que cores são

especificadas por componentes RGB e A (alfa –transparência)

– GLUT_INDEX: cores do programa são especificadas por tabela de cores

Page 19: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Definindo primitivas

• Sempre entre glBegin e glEnd

…define attributo de vértice

…define vértice

glBegin(tipo_de_prim);

glEnd();

Page 20: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Tipos de primitivas em OpenGL

GL_LINES

0

1

2

3 5

4

GL_LINE_STRIP

0

1

2

3

GL_LINE_LOOP0 1

234

GL_POLYGON(convexo)

04

3

2

1

GL_QUADS

03

21

4 7

65

GL_QUAD_STRIP

0

31

2 4

5

GL_TRIANGLES

0

1

2

34

5

GL_TRIANGLE_STRIP

1

02

3

4

5

GL_TRIANGLE_FAN

0

1

2 3

4

GL_POINTS

01

2

Page 21: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Segundo Exemplo

OpenGL: Uma Abordagem Prática e Objetiva

M. Cohen e I. H. Manssour

Page 22: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Segundo Exemplo (cont.)

Indica qual matriz estará no topo da pilha para operações subsequentes:

GL_MODELVIEW: matriz do modelo

GL_PROJECTION: matriz de projeção

GL_TEXTURE: matriz de textura

Define a janela quando se trabalha com projeção 2D:

Parâmetros: x mínimo, x máximo, y mínimo, y máximo

Page 23: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Segundo Exemplo (cont.)

Page 24: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Terceiro Exemplo

Inicializa sistema de coordenadas: sem esse comando, poderia dar erro

Page 25: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Terceiro Exemplo (cont.)

A viewport define a área dentro janela,

em coordenadas de tela, que OpenGL

pode usar para fazer o desenho. O

volume de visualização é, então,

mapeado para a nova viewport. Os 2

primeiros parâmetros são as coordenadas

do canto inferior esquerdo na tela, e as

2 últimas são largura e altura.

Page 26: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Terceiro Exemplo (cont.)

Page 27: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Window vs Viewport

• Window– Parte do universo que é do interesse

(parte do mundo que está sendo visualizada).

• SRU: Sistema de Referência do Universo

• Viewport– Parte do monitor onde será visualizado o

conteúdo

Page 28: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Window vs Viewport

Page 29: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Window vs Viewport

Page 30: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Transformações geométricas

Page 31: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Quarto Exemplo

Primitiva “clássica” em CG: bule

Page 32: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Quarto Exemplo (cont.)

Page 33: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Quarto Exemplo (cont.)

marks the normal plane of current

window as needing to be redisplayed.

Page 34: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados
Page 35: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

gluPerspective

glMatrixMode(GL_PROJECTION);

glLoadIdentity( );

gluPerspective(fovy, aspect, near, far);

glMatrixMode(GL_PROJECTION);

glLoadIdentity( );

gluPerspective(fovy, aspect, near, far);

w / h

Page 36: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

gluLookAt

gluLookAt(eyex, eyey, eyez, atx, aty, atz, upx, upy, upz);gluLookAt(eyex, eyey, eyez, atx, aty, atz, upx, upy, upz);

Page 37: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Outras Primitivas 3D

http://www.inf.pucrs.br/~manssour/

OpenGL/Tutorial.html

Page 38: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Solid

• Todas as primitivas anteriores podem ser também sólidas, ao invés de Wireframe:– Ex.: glutSolidTeapot(50.0f)

Page 39: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Exemplo de Animação

Page 40: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Exemplo de Animação (cont.)

Page 41: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

c

Tem que chamar a

função timer de novo

Page 42: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Exemplo de Animação (cont.)

Page 43: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Exemplo de Animação (cont.)

http://www.inf.pucrs.br/~manssour/

OpenGL/Tutorial.html

Page 44: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Iluminação em OpenGL

• Shading– Função glShadeModel.

• Parâmetros: GL_FLAT ou GL_SMOOTH (Gouraud shading, default)

• Material

pname: pode determinar as seguintes propriedades do material: GL_AMBIENT, GL_DIFFUSE,

GL_SPECULAR, GL_EMISSION, GL_SHININESS, GL_AMBIENT_AND_DIFFUSE

ou GL_COLOR_INDEXES

params: vetor que contém as componentes da propriedade que está sendo espeficada

Page 45: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Iluminação em OpenGL

Variação da função

Page 46: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Iluminação em OpenGL

• Modelo de iluminação

Page 47: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Iluminação em OpenGL

• Fontes de luz: Ambiente, Difusa, Especular, Emissiva

Page 48: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Iluminação em OpenGL

Page 49: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Exemplo de Programa com Iluminação

Page 50: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Exemplo de Programa com Iluminação

Page 51: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Exemplo de Programa com Iluminação

Page 52: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Exemplo de Programa com Iluminação

Page 53: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Exemplo de Programa com Iluminação

Page 54: 19 OpenGL 01 - PUC-Riowebserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2007/19...Pipeline OpenGL • Como uma aplicação faz chamadas às funções API OpenGL, os comandos são colocados

Material Adicional

• http://www.novateceditora.com.br/livros/opengl• http://www.inf.pucrs.br/~manssour/OpenGL/Tutorial.

html• http://www.cs.trinity.edu/About/The_Courses/cs357/

gl.html• http://www.opengl.org/resources/code/samples/s20

01/• http://fly.cc.fer.hr/~unreal/theredbook/