Top Banner
OpenGL OpenGL Alberto B. Raposo http://www.opengl.org
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

Jan 20, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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/