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
Download

Livro sobre OpenGL - resumo