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 Desenha Função Teclado Função Inicializa Função Principal
Primeiros passos em OpenGL
Veja exemplo em: http://www.novatec.com.br/livros/opengl/
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 OpenGLTipo 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 GLUTglutInitWindowPosition(int x, int y);
// Especifica o tamanho inicial em pixels da janela GLUTglutInitWindowSize(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érticesglEnd();
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: exemplos: cubos, cilindros, esferas,
cones objetos não-convexos (côncavos)
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ívelazuisverdesvermelhos
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 z-buffer) --> 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_BITGL_STENCIL_BUFFER_BITGL_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 vetortype: informa o tipo da informação
desejadabuffer: 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