OpenGL – Uma abordagem
prática e objetiva
Última atualização: 16-nov-2008
1 - Introdução
Computação Gráfica é uma área da
Ciência da Computação que se dedica
ao estudo e ao desenvolvimento de
técnicas e algoritmos para geração,
manipulação e análise de imagens pelo
computador
Introdução
aplicações gráficas
processamento gráfico
Pipeline
A palavra pipeline é usada para
descrever um processo composto de
duas ou mais etapas para geração de
uma imagem
Framebuffer
framebuffer – memória do dispositivo
gráfico
2 - Instalação
No DEV-C++
<alt>+<P> --> abre o menu Projeto
Selecionar Opções de Projeto
Selecione a aba Parâmetros e em Linker
verifique:
-lglut32 -lopengl32 -lglu32 -lwinmm -lgdi32
3 – Primeiros passos em
OpenGL
Função
Função
Função
Função
Desenha
Teclado
Inicializa
Principal
Primeiros passos em OpenGL
Veja exemplo em:
http://www.novatec.com.br/livros/open
gl/
4 – Padronização dos Nomes
das Funções e Tipos de Dados
Funções - Exemplos
void glColor(GLint red, GLint green,
GLint blue);
void glColor3d(GLdouble red, GLdouble
green, GLdouble blue)
Tipos de dados OpenGL
Tipo de dado
OpenGL
Representação
interna
Tipo de dado C equivalente
Sufixo
GLbyte
int 8 bits
signed char
b
GLshort
int 16 bits
short
s
GLint, GLsizei
int 32 bits
int ou long
i
GLfloat, GLclampf
ponto flutuante – 32
bits
float
f
GLdouble, GLclampd
ponto flutuante – 64
bits
double
d
GLubyte, GLBoolean
int 8 bits sem sinal
unsigned char
ub
GLushort
int 16 bits sem sinal
unsigned short
us
GLuint, GLemun,
GLbitfield
int 32 bits sem sinal
unsigned long ou unsigned int
ui
5 – GLUT – GL Utility Toolkit
Responsável pelo gerenciamento de
janelas e tratamento de eventos
GLUT - Funções
// Especifica a posição inicial da janela GLUT
glutInitWindowPosition(int x, int y);
// Especifica o tamanho inicial em pixels da
janela GLUT
glutInitWindowSize(int largura, int altura);
Criação da Janela
// Cria a janela passando como
argumento o título da mesma
glutCreateWindow(char *string);
Funções para tratamento de
eventos
glutDisplayFunc
glutReshapeFunc
glutKeyboardFunc
glutSpecialFunc
glutMouseFunc
glutMotionFunc
glutPassiveMotionFunc
glutIdleFunc
6 – Máquinas de Estado
Uma máquina de estados corresponde a
um dispositivo ou sistema que guarda o
estado de um ou mais elementos em
um momento específico
Comandos de entrada são utilizados
para alterar este estado e/ou gerar uma
função de saída
Máquina de estados
OpenGL é considerado uma máquina de
estados
É composto de várias variáveis de
estado que armazenam determinado
valor e podem ser alteradas pela
chamada a uma função
Cada variável de estado possui um valor
padrão (default) que pode ser alterado
Funções para alteração de
estado
void glEnable(GLenum cap)
void glDisable(GLenum cap)
GLBoolean glIsEnabled(GLenum cap)
--> verifica o estado que se encontra
uma propriedade
Variáveis de estado
Variáveis de estado relacionadas são
agrupadas em um atributo
void glPushAttrib(GLbitfield mask)
void glPopAttrib(void)
7 – Definição do Espaço de
Trabalho
modelo
coordenadas geométricas
sistema de referencia
Sistema de Referência do Universo
(SRU)
Sistema de Referência da Tela (SRT)
Definições
Modelo-> é uma representação
computacional de um objeto, isto é,
corresponde a uma estrutura de dados
que tem sua descrição geométrica
Imagem -> matriz de pontos
Universo -> é a região do plano (ou do
espaço) utilizada em uma aplicação
Definições
coordenadas geométricas
sistema de referência -> define uma
origem em relação a qual todos os
posicionamentos do universo são
descritos.
7.1 Visualização Bidimensional
Sistema de Referencia do
Universo
Sistema de Referência do Universo
(SRU) -> consiste em um plano
cartesiano com dois eixos (x e y)
perpendiculares entre si e que se
cruzam na origem
Sistema de Referência da Tela
Sistema de Referência da Tela (SRT) ->
no SRT a origem fica no canto superior
esquerdo do monitor
Definições
modelos são criados independentes do
dispositivo
windows ou janela de seleção --> é a área
do universo que delimita a região de
interesse do usuário em um dado instante
viewport ou janela de exibição --> define a
área do monitor onde desejamos exibir o
conteúdo da window
Mapeamento SRU --> SRT
Funções de conversão SRU
para SRT
void glViewport(
GLint x,
GLint y,
GLsizei largura,
GLsizei altura);
void gluOrtho2d(
GLdouble left,
GLdouble right,
GLdouble bottom,
GLdouble top)
7.2 Visualização Tridimensional
Câmera Sintética
Projeção
Funções OpenGL
Visualização Tridimensional
Quando se trabalha em três dimensões,
o SRU (Sistema de Referência do
Universo) passa a ser composto por três
eixos ortogonais entre si (x, y e z) e
pela origem (0.0, 0.0, 0.0)
Visualização Tridimensional
Projeção: é a operação de obter
representações bidimensionais de
objetos tridimensionais
Raios de projeção (segmentos de reta)
chamados projetantes
Plano de projeção
Projeções Geométricas
Planares
Projeção Paralela Ortográfica --> as
projetantes são paralelas entre si, passam
pelos pontos qeu definem os objetos e
interseccionam o plano com um ângulo de
90º
Projeção Perspectiva --> as projetantes
emanam de um único ponto que está a uma
distancia finita do plano de projeção e
passam pelos pontos que definem um objeto
Funções OpenGL
void gluLookAt() --> permite
especificar a posição e a orientação da
câmera sintética ou observador virtual
void gluPerspective() -->
utilizada para estabelecer a projeção
perspectiva
void glOrtho() --> função utilizada
para estabelecer projeção ortográfica
Funções OpenGL
void glLoadIdentity(void) --> função utilizada para
inicializar o sistema de coordenadas (carrega a matriz
identidade)
void glMatrixMode(GLenum mode) --> permite
selecionar com qual matriz será trabalhado
GL_MODELVIEW --> seleciona a matriz do modelo (de
modelagem e transformação)
GL_PROJECTION --> seleciona a matriz de projeção
GL_TEXTURE --> seleciona a matriz de textura
Funções GLUT
void glutWireCube(GLdouble tamanho)
--> função da biblioteca GLUT
responsável pelo traçado de um cubo
8 – Desenhos bidimensionais
8.1 Primitivas Gráficas
8.2 Cores e Estilos de Traçados de
Primitivas
8.3 Exibição de Texto
8.4 Desenhos de Curvas Paramétricas
8.1 - Primitivas Gráficas
Primitivas gráficas consistem nos
elementos básicos que compõem um
desenho, tais como pontos, segmentos
de reta e círculos
Primitivas Gráficas
vértices
objetos
cenas
modelos
Desenho de primitivas
glBegin(<argumento>);
// lista de vértices
glEnd();
onde <argumento>determina qual objeto
será desenhado
Primitivas Gráficas em OpenGL
(valores usados em <argumento>)
GL_POINTS – desenha pontos
GL_LINES – desenha linhas
GL_LINE_STRIP – desenha segmentos de linhas conectados
GL_LINE_LOOP – desenha segmentos de linhas conectados,
unindo o primeiro ao último
GL_POLYGON – desenha um polígono
GL_TRIANGLES – desenha um triângulo
GL_TRIANGLES_STRIP – desenha um triângulos conectados
GL_TRIANGLES_FAN – desenha triângulos a partir de um ponto
central
GL_QUADS – desenha quadriláteros
GL_QUADS_STRIP – desenha quadriláteros conectados
Exemplos
glBegin(GL_LINES);
glVertex2f(12.0f, 12.0f);
glVertex2f(100.5f, 100.5f);
glEnd();
Desenha uma linha entre os dois vértices
8.2 Cores e Estilos de Traçado
de Primitivas
Primitivas podem ser desenhadas com
diversas aparências como: cores, estilos
e padrões diferentes
Exemplo de Funções
Alteração do tamanho dos pontos
void glPointSize(GLfloat tamanho)
Linhas: alteração de cor, espessura e
estilo
void glLineWidth(GLfloat largura)
8.3 Exibição de Texto
Não suportado diretamente pela OpenGL,
porém suportado pela GLUT
Suporta dois tipos de fontes de caracteres:
strokes (segmentos de reta) -->mais flexíveis
(podem ser escaladas e rotacionadas)
bitmap (formando por imagens que representam
caracteres) --> mais rápidas para serem exibidas
Caracteres – bitmap
void glutBitmapCharacter(void *font, int
character), onde:
font: define o tamanho da fonte
caracter: define o caracter
Constantes para tipos de
fontes
GLUT_BITMAP_8_BY_13
GLUT_BITMAP_9_BY_15
GLUT_BITMAP_TIMES_ROMAN_10
GLUT_BITMAP_TIMES_ROMAN_24
GLUT_BITMAP_HELVETICA_10
GLUT_BITMAP_HELVETICA_12
GLUT_BITMAP_HELVETICA_18
Posicionamento
void glRasterPos2f(x,y)
Exibição de caracteres usando
font stroke
void glutStrokeCharacter(void *font, int
caracter), onde
font: define o nome da fonte
(GLUT_STROKE_ROMAN e
GLUT_STROKE_MONO_ROMAN)
caractere: define o código ASCII do
caractere a ser exibido
9 – Transformações Geométricas
Translação
Escala
Rotação
Translação
void glTranslate(GLfloat tx, GLfloat ty,
GLfloat tz)
Escala
void glScale(GLfloat ex, GLfloat ey,
GLfloat ez)
Rotação
void glRotate(GLfloat ângulo, GLfloat
x, GLfloat y, GLfloat z) onde:
ângulo: é o ângulo de rotação
Obs: no caso de rotação em 2D, a
rotação é sempre feita em torno do eixo
z (usar (0,0,1) para (x,y,z)
respectivamente)
Rotação
ângulo positivo --> rotação feita no
sentido anti-horário
ângulo negativo --> rotação feita no
sentido horário
Matriz de Transformação
matrizes com coordenadas homogêneas
matriz de transformação corrente
glLoadIdentity --> faz com que a matriz
de transformação corrente seja inicializada
com a matriz identidade, indicando que
nenhuma transformação foi aplicada
glMatrixMode com parâmetro
GL_MODELVIEW
Escopo das Transformações
pilha de matrizes de transformação
void glPushMatrix(void)
void glPopMatrix(void)
10 - Animação
Introdução
Animação em 2D
Animação em 3D
Conceitos básicos
animação tradicional
animação por computador
taxa de exibição de imagens (frame
rate)
Use de dois buffers
glutInitDisplayMode(GLUT_DOUBLE |
GLUT_RGB)
glutSwapBuffers --> troca os
buffers de exibição e desenho
Animação em 2D
void glutTimerFunc(unsigned int msecs, void
(*func)(int value), int value)
// Registra a função callback que será chamada a cada intervalo de tempo
glutTimerFunc(150, Anima, 1)
void Anima(int value) {
...
glutPostRedisplay();
glutTimerFunc(150, Anima, 1);
}
11 – Operações de Zoom e
Pan
12 – Imagens em OpenGL
13 – Desenhos Tridimensionais
Primitivas Gráficas de 3D
Objetos Predefinidos da GLUT
Carregando e Desenhando Objetos
Desenhando Superfícies Paramétricas
14 - Realismo
Conceitos
fonte de luz
idéia de iluminação
Conceitos
wireframe
sólidos
faces frontais
faces traseiras
objetos oclusos
GL_CULL_FACE
variável de estado: GL_CULL_FACE
Objetos
objetos convexos:
objetos não-convexos (côncavos)
exemplos: cubos, cilindros, esferas, cones
exemplos: torus (toróide)
algoritmo de remoção de faces
Z-Buffer
z-buffer -> algoritmo de remoção de
superfícies escondidas
Fontes de Luz
Um modelo de iluminação em
Computação Gráfica define a natureza
da luz que emana de uma fonte e sua
interação com todos os objetos de uma
cena. A natureza da luz diz respeito à
fontes de luz utilizada. Geralmente, três
tipos de fontes de luz podem ser
incluídas em uma cena 3D: pontual,
direcional e spot.
Fontes de Luz
fonte de luz pontual:
fonte de luz direcional:
fonte de luz tipo spot:
Modelos de Reflexão
luz ambiente
reflexão difusa
reflexão especula
Modelos de Tonalização
(shading)
Modelos
flat shading
modelo de Gouraud
14.4 Vetores Normais
Um vetor normal a uma face, ou
superfície, é um vetor perpendicular a
essa face.
vetor unitário
produto vetorial
Vetor Normal
void glNormal3f(GLfloat nx, GLfloat ny,
GLfloat nz)
14.5 Descrição de Cores
14.5.1 Conceitos
Descrição das cores
A cor é um fenômeno "psicofísico", que
depende da presença de luz no ambiente: se
não há luz, não é possível enxergar cores
percepção de cor
depende da física da luz – considerada energia
eletromagnética – e sua interação com os
materiais físicos
interpretação do fenômeno resultante pelo
sistema visual humano
Conceitos
raio de luz:
Sistema Visual Humano
faixa visível do espectro
eletromagnético (380 a 750 nm)
luz monocromática
luz cromática (colorida)
Sistema Visual Humano
Na retina existem os:
cones – são sensíveis a energia em todo
espectro visível
azuis
verdes
vermelhos
bastonetes – são sensíveis a intensidade
luminosa
Sistema Visual
sensação de cor
espaço de representação de cores
tridimensional
modelos de cor
YIQ (padrão NTSC)
YUV
CMY (Cyan, Magenta e Yellow)
RGB (Red, Green, Blue)
14.5.2 Funções OpenGL
O modelo de cor adotado em OpenGL é
o RGB ou RGBA (alpha – utilizado
quando se está trabalhando com
blending – o alpha especifica a
opacidade)
Modelo de cores
color buffer
24 bits por pixel ( 8 bits para R, G e B )
tabela de cores (look-up table)
Funções OpenGL
void glClear(GL_COLOR_BUFFER_BIT)
Limpa o conteúdo do framebuffer
void glClearColor(
GLclampf red,
GLclampf green,
GLclampf blue,
GLclampf alpha)
Especifica a cor usada por glClear (a cor default
é (0.0, 0.0, 0.0) – preta)
Funções OpenGL
void glColor3f(
GLfloat red,
GLfloat green,
GLfloat blue)
14.6 Uso de Múltiplas Fontes
de Luz
14.7 Materiais
14.8 Sala 3D
15 – Blending (mistura)
alpha – utilizado quando se está
trabalhando com blending – o alpha
especifica a opacidade
1.0 – cor totalmente opaca
0.0 – cor é totalmente transparente
15.1 Funções de Mistura
Transparência
Efeitos Atmosféricos
função neblina
Suavização de Linhas e
Polígonos
aliasing
16 – Mapeamento de Texturas
Texturas Unidimensionais
Texturas Bidimensionais
17 – Técnicas para Otimização
do Rendering
18 - Buffers
Um buffer em OpenGL nada mais pe do
que uma área de memória onde é
armazenada uma matriz de valores,
que, por sua vez correspondem aos
pixels de uma imagem
Buffers - Tipos
Color Buffer (ou buffer de cor) --> responsável por
armazenar informações de cor (RGBA) para cada
pixel
Depth Buffer (ou buffer de profundidade ou zbuffer) --> armazena a distância de cada pixel ao
observador
Stencil Buffer (ou buffer de estêncil) --> fornecem
opções para restringir ou bloquear o desenho na tela,
de acordo com certas condições.
Accumulation Buffer (ou buffer de acumulação) -> pode ser visto como um buffer de cor com maior
precisão, em que é possível combinar várias imagens
em uma só, de várias formas diferentes
Função glutInitDisplayMode
void glutInitDisplayMode(unsigned int mode)
onde mode:
GLUT_RGB, GLUT_RGBA ou GLUT_INDEX para
o modelo de cor; GLUT_SINGLE ou
GLUT_DOUBLE para utilização de um ou dois
buffers; GLUT_ACUM, GLUT_ALPHA,
GLUT_DEPTH, GLUT_STENCIL,
GLUT_MULTISAMPLE, GLUT_STEREO,
GLUT_LUMINANCE
Função glutInitDisplayMode
Especifica o modelo de cor, a utilização de
single ou double-buffer e quais buffers
OpenGL serão utilizados na janela GLUT
que será aberta.
Funções para inicialização de
buffers
void glClear(GLbitfield mask) --> função
para limpar os buffers cujos
identificadores são passados como
parâmetros mask
GL_COLOR_BUFFER_BIT,
GL_DEPTH_BUFFER_BIT
GL_STENCIL_BUFFER_BIT
GL_ACCUM_BUFFER_BIT
18.2 Color Buffer
GL_COLOR_BUFFER_BIT
Função glClearColor
void glClearColor(GLclampf red,
GLclampf green, GLclampf blue,
GLclampf alpha) --> especifica qual cor
será usada para limpar o color buffer
18.3 Depth Buffer
GL_DEPTH_BUFFER_BIT
void glClearDepth(GLclampf depth),
onde depth (profundidade) varia de 0.0
(mín) a 1.0 (máx)
18.4 Stencil Buffer
GL_STENCIL_BUFFER_BIT
18.5 Accumulation Buffer
GL_ACCUM_BUFFER_BIT
19 – Seleção de Objetos
Considerações Iniciais
Modo de Seleção
Modo de Feedback
Introdução
Seleção de objetos
Modo de Seleção
void glSelectBuffer(GLsizei size, GLuint
*buffer)
pilha de nomes
GLint glRenderMode(GLenum mode)
onde mode: GL_RENDER, GL_SELECT ou
GL_FEEDBACK
Modo de Seleção
void glInitNames(void)
void glPushName(GLuint name)
Modo de feedback
void glFeedbackBuffer(GLSizei size, GLenum
type, GLfloat *buffer),
onde:
size: indica o tamanho do vetor
type: informa o tipo da informação
desejada
buffer: aponta ao inicio do vetor
20 – OpenGL e Outras
linguagens de Programação
C++
Java
C#
Python
21 – Programação de Shaders
OpenGL Shading Language
Apêndice A – Guia Rápido de
Referência
A.1
A.2
A.3
A.4
A.5
A.6
A.7
A.8
A.9
Apêndice A – Guia Rápido de
Referência
A.10
A.11
A.12
A.13
A.14
A.15
A.16
A.17
A.18
Apêndice B – Biblioteca de
Estruturas e Funções Auxiliares
B.1
B.2
B.3
B.4
B.5
A.1 Funções GLUT de
Inicialização
Apêndice B – Biblioteca de
Estruturas e Funções Auxiliares
B.6
B.7
B.8
B.9