Você está na página 1de 51

Introdução ao OpenGL

1-Introdução
1-Introdução ao
ao OpenGL
OpenGL
Prof. João Madeiras Pereira e Mário Rui
Gomes

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Bibliografia
Bibliografia

A) OpenGL Programming Guide (3ª Edição)

B) Computer Graphics – Principles and


Practice (Foley, Van Dam)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 1
Introdução ao OpenGL
Programa
Programa

• 1- OpenGL (Bibliotecas, Exemplos de Utilização,


Pipelines) (Cap. A1, pág. 1-20)
• 2-Desenho de Objectos Geométricos,
Transformações Geométricas e Animação) (Cap.
A1, pág. 20-25, A2, pág. 29-59)
• 3- Interacção (event-driven input, display-lists,
Menus, Picking) (Cap. B2, pag. 41-44, B4, pág. 188-
195, B10, pág. 435-442, A7, pág. 255-270, A13, pág.
531-552)
• 4-Cor e Iluminação (Cap. A4, pág. 167-172 e A5,
pág. 177-190 e 197-215)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Abordagem
Abordagem

• Nesta introdução revisitam-se conceitos


importantes leccionados em CG através da sua
concretização em OpenGL.
• Considerando que a parte prática de MVT é
desenvolvida recorrendo a OpenGL, sempre
que relevante, apresentam-se aspectos
específicos e dão-se alguns exemplos de
aplicações.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 2
Introdução ao OpenGL

OpenGL
OpenGL
(Bibliotecas,
(Bibliotecas, Exemplos
Exemplos de
de Utilização,
Utilização, Pipelines)
Pipelines)

(Cap. A1, pág. 1-20, Cap. B4, pág. 165-170)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

O
O OpenGL
OpenGL

• Interface Procedimental (API, Application


Programming Interface )
Vantagens:
– Norma industrial (mais de 300 empresas)
– Estável
– Portável
– Escalável
– Fácil de Usar
– Bem documentada

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 3
Introdução ao OpenGL
Pipeline
PipelineRevisitado
Revisitado

Coordenadas 3D do Modelo Modelos 3D


Transf. Modelação e Visualização
Coordenadas 3D do Mundo Primitivas 3D
Projecção
Coordenadas 2D Normal. Primitivas 2D
Discretização
Coordenadas 2D Quadrículas
Criação da Imagem

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Pipeline
PipelineOpenGL
OpenGLSimples
Simples

Versão simplificada do pipeline OpenGL

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 4
Introdução ao OpenGL
Pipeline
PipelineOpenGL
OpenGL

Per-Vertex
Vertex Operations
Data and
Evaluators
Primitive
Display Assembly
Rasterization Per-Fragment Frame
List Operations buffer

Texture
Pixel
Assembly
Operations
Pixel
Data

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Vértices
Vérticesee Quadrículas
Quadrículas

São suportados objectos de dois tipos:


– Geométricos (Vértices 3D)
– Imagens (Quadrículas 2D ou pixels)

Existem processadores diferentes para cada


tipo de objectos. As máquinas OpenGL
permitem a interligação dos 2 pipelines.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 5
Introdução ao OpenGL
Lista
Lista de
deDesenho
Desenho

• Os objectos (geometria ou quadrículas), por


omissão são imediatamente transformados
numa Imagem (modo imediato).
• Pode ser usada a Lista de Desenho (display
list) para armazenar comandos de desenho
para processamento posterior (modo de
retenção).

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Avaliadores
Avaliadores

• Convertem representações paramétricas de


objectos com Texturas e Cor (a partir das
coordenadas dos pontos de controlo) na
geometria de uma malha de polígonos planares
(facetas) e calculam ainda:
– Normais
– Coordenadas de texturas
– Cor

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 6
Introdução ao OpenGL
Operações
Operaçõessobre
sobrevértices
vértices

• Conversão dos vértices em Primitivas. Inclui:


– Transformações de Modelação e Visualização;
– Cálculo de coordenadas para mapeamento de
texturas
– Cálculo de iluminação (usando a normal, a posição
da fonte de luz, as propriedades dos materiais);

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Assemblar
Assemblar Primitivas
Primitivas

• São criadas primitivas geométricas completas


(vértices transformados, com cor,
profundidade e coordenada de textura) obtidas
através de:
– Recorte;
– Remoção de elementos invisíveis.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 7
Introdução ao OpenGL
Operações
Operaçõessobre
sobreQuadrículas
Quadrículas

• As quadrículas sofrem as seguintes operações:


– Desempacotadas (de vários formatos suportados);
– Escaladas, transladadas e aplicadas operações
lógicas;
– Limitadas a um valor máximo;
– Enviadas para a memória de texturas ou para o
andar de discretização.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Assemblar
Assemblar Texturas
Texturas

• Várias texturas, descritas através de pixelmaps


podem ser aplicadas a objectos geométricos
3D. Para isso define um bloco de memória
onde são armazenadas as diferentes imagens
de texturas para posterior selecção e
mapeamento.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 8
Introdução ao OpenGL
Discretização
Discretização

• Corresponde à conversão de geometria em elementos


quadrados designados por fragmentos. Estes têm
correspondência directa com os pixels constituinets
do framebuffer.
• Um fragmento inclui a cor, profundidade e valor da
coordenada de uma textura. O fragmento é obtido
após a aplicação de características como o tipo de
linha, a dimensão do ponto e operações de anti-
aliasing.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Operações
Operaçõessobre
sobreFragmentos
Fragmentos

• Antes de se proceder à visualização podem ser


aplicadas várias operações (por omissão
inactivas) como:
–Aplicação de textura;
–Cálculo de nevoeiro;
–Testes de recorte, alfa, estêncil, remoção de
superfícies ocultas;
–Operações de mistura, dithering e lógicas.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 9
Introdução ao OpenGL
Tipos
Tipos de
de Dados
DadosOpenGL
OpenGL
• Portabilidade facilitada com a definição de tipos de dados
OpenGL

Tipo de dado Representação Tipo de dado C


Sufixo
OpenGL interna equivalente
GLbyte 8-bit integer signed char b
GLshort 16-bit integer short s
GLint, GLsizei 32-bit integer int ou long i
GLfloat, GLclampf 32-bit floating-point float f
GLdouble, GLclampd 64-bit floating-point double d
8-bit unsigned
GLubyte, GLboolean unsigned char ub
integer
16-bit unsigned
GLushort unsigned short us
integer
GLuint, GLenum, 32-bit unsigned unsigned long ou
ui
GLbitfield integer unsigned int

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Convenção
Convenção p/
p/ comandos
comandos OpenGL
OpenGL

• <PrefixoBiblioteca> <ComandoRaiz>
<NúmeroArgumentosOpcional> <TipoArgumentosOpcional>
• Exemplos:
– glColor3f
– glColor3i
– glColor3d

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 10
Introdução ao OpenGL
Bibliotecas
Bibliotecas

Toolkit de Alto Nível


(Fahrenheit Scene
Graph)

Utility Library glu


OpenGL gl
Utility Toolkit glut
Sistema de Gestão de glx, wgl,agl
Janelas
©JAP, MRG & Instituto Superior Técnico, 2001/2002

Biblioteca
Bibliotecaglu
glu

• Especificação de Texturas
• Transformação de Coordenadas (gluLookAt,..)
• Tessellation (triangulação de polígonos)
• Quadráticas
• Nurbs (superfícies paramétricas)
• Gestão de Erros (ocorrência e descrição de
erros)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 11
Introdução ao OpenGL
Biblioteca
Bibliotecaglut
glut

• Toolkit independente do Sistema de Gestão de


Janelas o qual suporta:
– Gestão de Janelas (criação, redesenho, posição,
dimensões,..) e Tabela de Cores.
– Funções de Retorno (callback).
– Gestão das Unidades de Entrada de Dados (rato,
teclado).
– Ciclo de Execução (glutMainLoop) e Processo de
Background.
• Desenho de Objectos 3D (Toros, Esferas, etc.)!
©JAP, MRG & Instituto Superior Técnico, 2001/2002

Biblioteca
Bibliotecawgl
wgl

• Extensão para Microsoft a qual suporta:


– Formato das quadrículas.
– Acesso a extensões (dependentes do ambiente).
– Gestão de buffers.
– Sincronização (com o pipeline do Windows –
GDI).
– Acesso directo à Tabela de Cores.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 12
Introdução ao OpenGL
Máquina
Máquina de
deEstados
Estados
• Vários modos de funcionamento definidos por variáveis de
estado:
– Cor de desenho
– Estilo de desenho de linhas
– Posição e caracteristicas das fontes de luz
– Etc.
• Utilização dos comandos glEnable() e glDisable()
• Exemplo:
 



  

   
 
  
 

 
!  "

!  "

!  "##
## $#" "#
$#" "#
#" "#


%! 

%! %!  
%!   
%!   

 
!  "

!  "

!  "##
## &' !
&' ! 
' ! 

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Demonstração
DemonstraçãoFog
Fog

Usar a aplicação fog para mostrar:


• Sintaxe do OpenGL;
• Vários Tipos de Modelos;
• Desenho de imagens 3D e de texto 2D;
• Tipos de efeitos no cálculo da Imagem;
• Existência de uma hierarquia de Janelas Gráficas;
• Utilização dos Menus;
• Operação de Picking.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 13
Introdução ao OpenGL
Primeiro
PrimeiroPrograma
Programa
#include <windows.h>
#include <GL/glut.h>

void RenderScene(void) // Called to draw scene


{
glClear(GL_COLOR_BUFFER_BIT); // Clear the window with current clearing color
glFlush(); // Flush drawing commands
}

void Setup(void) // Setup the rendering state


{
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}

// Main program entry point


void main(void)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("Simple");
glutDisplayFunc(RenderScene);
Setup();
glutMainLoop();
}

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Funções
FunçõesGLUT
GLUTutilizadas
utilizadas

• void glutInitDisplayMode (unsigned int mode);


Define uma série de propriedades associadas às janelas que venham a ser criadas

• int glutCreateWindow (char* name);


Abre uma janela com as características previamente definidas. Devolve o seu
identificador

• void glutDisplayFunc (void (*func)(void));


Especifica a função a invocar sempre que o conteúdo de uma janela tem de ser
redesenhado (abertura, pop-up, objectos sobrepostos…)

• void glutMainLoop (void);


Função para activação do ciclo infinito de processamento de eventos.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 14
Introdução ao OpenGL

Desenho
Desenho de
de Objectos
Objectos Geométricos,
Geométricos,
Transformações
Transformações ee Animação
Animação

(Cap. A1, pág. 20-25, Cap. A2, pág.


29-59)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Desenhando
Desenhandouma
umaPrimitiva
Primitiva
glBegin (GL_POLYGON);
glVertex2f (0.0, 0.0);
glVertex2f (0.0, 3.0);
glVertex2f (4.0, 3.0);
glVertex2f (6.0, 1.5);
glVertex2f (4.0, 0.0);
glEnd ( );

• glBegin e glEnd marcam o início e fim de uma lista de vértices que descreve a geometria de
uma primitiva com o tipo seleccionado em glBegin.

• Para além da função glVertex, que permite definir a geometria de cada vértice, existem outras
funções que, de uma forma modal, atribuem diversas características aos vértices:

glColor (), glIndex () definem a côr


glNormal () define o vector normal ao vértice
glTextCoord () define uma coordenada de textura
glMaterial () define propriedades ópticas do material

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 15
Introdução ao OpenGL
Tipos
Tiposde
de
Primitivas
PrimitivasGeométricas
Geométricas

• GL_POINTS (conjunto de pontos)


• GL_LINES (segmentos de recta)
• GL_LINE_STRIP (linha poligonal)
• GL_LINE_LOOP (linha poligonal fechada)
• GL_TRIANGLES (conjunto de triângulos)
• GL_TRIANGLES_STRIP (conjunto ligado de triângulos)
• GL_TRIANGLES_FAN (conjunto ligado de triângulos)
• GL_QUADS (conjunto de quadriláteros)
• GL_QUADS_STRIP (conjunto ligado de quadriláteros)
• GL_POLYGON (polígono)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Primitivas
PrimitivasGráficas
GráficasSimples
Simples v4
v1 v2
v3 v0
v2 v2
v0 v2 v4 v4 v3
v0 v7 v3 v3
v1 v6 v5 v4 v1 v0 v1
GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP
v1 v2
v5 v0 v2 v4
v1 v4 v3

v0 v2 v3 v1 v0
v3 v5 v4
GL_TRIANGLES GL_TRIANGLE_STRIP GL_TRIANGLE_FAN
v7 v0
v6 v5
v1 v3 v4
v2
v1 v5 v1

v0 v3 v7 v6 v3
v0 v4
v4 v2 v2
GL_QUADS GL_QUAD_STRIP GL_POLYGON

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 16
Introdução ao OpenGL
Restrições
RestriçõesààDefinição
Definiçãode
dePolígonos
Polígonos
• Polígonos simples, sem auto-intersecções, ou seja, intersecções entre pares de arestas.

• Polígonos Convexos

• Polígonos Simplesmente Conexos (sem “buracos”)

• Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do
ponto de observação)

• Polígonos mais complexos ou irregulares podem ser gerados por união de polígonos simples
(Tesselation)

Polígonos Válidos Polígonos Inválidos

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Gestão
Gestãode
deEstado
EstadoeeAtributos
AtributosGráficos
Gráficos
Tanto os atributos gráficos mais clássicos ( côr de desenho, côr de preenchimento,
estilo de linha, etc…) como propriedades ou capacidades gráficas (capabilities) que afectam
a síntese da cena de uma forma mais abrangente (iluminação, textura, remoção de superfícies,
nevoeiro,…), são armazenados em variáveis de estado.
Existem funções para activar (ON), desactivar (OFF) e interrogar variáveis de estado
booleanas: (GL_DEPTH_TEST, GL_FOG, GL_LIGHTING, …)

void glEnable (GLenum capability);


void glDisable (Glenum capability);
void glIsEnabled (Glenum capability);

Um outro conjunto de funções permite obter o valor corrente de variáveis de estado mais
complexas (GL_CURRENT_COLOR, GL_CURRENT_NORMAL, etc..)
void glGetBooleanv (GLenum pname, Glboolean *params);
void glGetIntegerv (GLenum pname, GLint *params);
void glGetFloatv (GLenum pname, GLfloat *params);
void glGetDoublev (GLenum pname, GLdouble *params);
void glGetPointerv (GLenum pname, GLvoid **params);

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 17
Introdução ao OpenGL
Alguns
AlgunsAtributos
AtributosGráficos
Gráficos

glPointSize: Tamanho de um ponto em pixels

glLineWidth: Espessura de linha em pixels

glLineStipple: Padrão para linhas

glPolygonMode: Modo de desenho do polígono (point, line, fill)

glFrontFace: Sentido de Circulação para Front-Faces e Back-Faces

glCullFace: Escolha de qual o tipo de faces a remover antes da rasterização

glPolygonStipple: Padrão de preenchimento de polígonos

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Vértices
Vértices

• A cada vértice pode associar-se:


– Cor definida por valor ou como índice de uma
tabela de cores
– Vector normal
– Coordenada de uma textura
– Propriedade do material
– Indicação precede uma aresta de fronteira
• E podem ser definidos através de Arrays.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 18
Introdução ao OpenGL
Transformações
TransformaçõesGeométricas
Geométricas

• Vértices e Normais são transformadas pela


matriz de Modelação-Visualização e pela
matriz de Projecção.
• Para facilitar a composição de Matrizes existe
um gestor de stack de matrizes.
• Podem ser usados 6 planos adicionais de
recorte.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Desenho
Desenhode
deObjectos
Objectos

• As Primitivas são recortadas:


– 1º Planos de Recorte definidos pela aplicação
– 2º Volume de Recorte:
• E transformadas em coordenadas de ecrã dentro
de um enquadramento o qual é definido por:
– Número de planos
– Posição e dimensões do viewport

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 19
Introdução ao OpenGL
Rasterização
Rasterizaçãode
deLinhas
Linhas

• As funções associadas a linhas permitem


definir:
– Diâmetro do ponto a discretizado, por omissão 1.0.
– Largura das linhas discretizadas, quer tenha ou
não sido aplicado um processamento de anti-
aliasing.
– Padrão de preenchimento de linha e respectivo
factor multiplicativo.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Rasterização
Rasterizaçãode
dePolígonos
Polígonos

• As funções associadas a polígonos permitem


definir:
– Padrão de preenchimento de polígono;
– Faces dos polígonos que são traseiras;
– Qual a face da frente do polígono;
– Modo como os polígonos são rasterizados.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 20
Introdução ao OpenGL
Demonstração
Demonstraçãoshapes
shapes

Usar a aplicação shapes para mostrar:


• Tipos de Objectos Geométricos (glBegin);
• O estado Cor (usar o polígono);
• Geometria da malha de triângulos (alterar 2ª e 3ª cor
do Triangle_Strip);
• Polígonos não planares;
• Atributos (fronteira do polígono).

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Transformações
TransformaçõesGeométricas
Geométricasno
noPipeline
Pipeline
Numa perspectiva de Câmara Virtual, a definição das transformações necessárias ao
posicionamento da câmara (visualização) e disposição dos objectos na cena (modelação)
faz-se, geralmente, na seguinte sequência:
1. Posicionar e orientar a câmara dentro do espaço da cena (Transformação de Visualização).

2. Compôr a cena, colocando os objectos constituintes nas posições e orientações com que
se pretende que sejam “fotografados” (Transformação de Modelação).
3. Escolher uma lente para a câmara ou ajustar o Zoom (Transformação de Projecção).

4. Determinar as dimensões e posição da “fotografia” final (Transformação de Viewport).

Vertex
ModelView
ModelView Projection
Projection Perspective
Perspective Viewport
Viewport
Matrix
Matrix Matrix
Matrix Division
Division Transformation
Transformation

Eye Clip Normalized Window


World
Coordinates Coordinates Device Coordinates
coordinates
Coordinates

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 21
Introdução ao OpenGL
AADefinição
Definiçãode
deTransformações
Transformações

1) As matrizes de Modelação e de Visualização ficam concatenadas numa única matriz,


designada MODELVIEW.

2) Existe uma função para seleccionar a matriz sobre a qual se pretende efectuar uma alteração.
glMatrixMode ( ) permite comutar entre GL_MODELVIEW (Modelação-Visualização) e
GL_PROJECTION (Projecção).
3) Sempre que é aplicada uma nova matriz de transformação M, essa matriz é multiplicada pela
matriz corrente C (glMultMatrix (matrix*)), à sua direita: CM. Deste modelo resulta que
as transformações são aplicadas aos objectos pela ordem inversa daquela por que são definidas.

4) Dada a dependência entre visualização e modelação, o programador deve começar por definir
a transformação de visualização e só depois as transformações de modelação, para que a
primeira possa afectar os objectos depois de devidamente posicionados e orientados na cena.

5) Dado que nem sempre se pretende um efeito acumulativo, existem funções para estabelecer
um dado valor para a matriz corrente (glLoadMatrix (matriz*)) ou inicializá-la com a matriz
identidade (glLoadIdentity ()).

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Transformações
Transformaçõesde
deModel.
Model.eeVis.
Vis.Básicas
Básicas
Quando se pretende aplicar transformações básicas,
glTranslate (x, y, z);
o openGL fornece funções utilitárias que, face a
glRotate (angle, x, y, z);
glMultMatrix, têm a vantagem de calcular as matrizes
glScale (x, y, z);
a partir dos parâmetros de transformação:

Transformação de Objectos versus Transformação de Referencial


y y
Objecto: Referencial:
1º Translação 1º Rotação
2º Rotação 2º Translacção
R
T

R
x x
z z
T
Nota: Quando se aplicam transformações de escala, a visão por referencial pode tornar-se
menos intuitiva. Com escalamento não uniforme e rotações, os eixos do referencial
local podem deixar de ser ortogonais.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 22
Introdução ao OpenGL
Definir
DefiniraaTransformação
Transformaçãode
deVisualização
Visualização

1) Através de Sucessivas Translacções e Rotações


A definição da Transformação de Visualização (posição e orientação da câmara dentro do
espaço da cena) pode ser feita por invocação das funções glTranslate e glRotate. Os parâmetros
indicam movimentos dos objectos face a uma câmara estática e os seus valores simétricos
podem ser encarados como movimentos da câmara face aos objectos.
up
2) Através da Função gluLookAt (): Y vector

gluLookAt ( eyex, eyey, eyez,


centerx, centery, centerz, eye
upx, upy, upz );

center X

Z
©JAP, MRG & Instituto Superior Técnico, 2001/2002

Transformação
Transformaçãode
deProjecção
Projecção
A definição desta transformação assume a câmara posicionada na origem do referencial,
a apontar no sentido negativo do eixo dos zz´. A utilização de rotações e translacções para
alterar a posição e orientação do volume de visualização é possível mas não recomendada
(controlo pouco intuitivo).
1) PERSPECTIVA: Volume de Visualização Especificado por glFrustum ()

void glFrustum ( left, right, far


bottom, top,
near, far ); near

top
left

right
Nota: Com esta função é possível definir
bottom
um Volume de Visualização assimétrico

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 23
Introdução ao OpenGL
Transformação
Transformaçãode
deProjecção
Projecção(cont.)
(cont.)
2) PERSPECTIVA: Vol. de Visualiz. especificado por gluPerspective ()

void gluPerspective ( fovy, aspect,


near, far );
w
fovy: abertura da câmara, fovy
medida por um ângulo
no plano xoz h

aspect = w / h near
far

3) PARALELA (Ortogonal): Vol. de Visualização especificado por glOrtho ()


top
void glOrtho ( left, right, left
bottom, top,
near, far );
right
viewpoint

bottom
near far

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Demonstração
Demonstraçãoprojection
projection

Usar a aplicação projection para mostrar:


• Vários tipos de projecção;
• Utilização de função do gluLookAt;
• Planos de Recorte;
• Abertura da câmara.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 24
Introdução ao OpenGL
Transformação
Transformaçãode
deViewport
Viewport
Os objectos gráficos, depois de transformados pelas matrizes MODELVIEW e PROJECTION,
e depois de recortados pelos seis planos delimitadores do volume de visualização, devem ser
submetidos à Transformação de Viewport:

Define-se a porção da área do dispositivo de saída onde deve ser mapeada a projecção da cena.
Essa definição é feita em coordenadas da janela activa (canto inferior esquerdo. largura e altura).
Por defeito, o viewport coincide com a totalidade da janela gráfica.

void glViewport (GLint x, GLint y,


GLsizei width, GLsizei height);

Notas : Se a relação de aspecto do Viewport não fôr a mesma


da janela de projecção, a imagem projectada pode sofrer
distorção.

A aplicação deve detectar eventos de redimensionamento


da janela gráfica e modificar o viewport de acordo com essa alteração

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Mapeamento
Mapeamentojanela-viewport
janela-viewport

Calcular a transformação que mapeia a janela de


visualização limitada por Xwmin, Xwmax, Ywmin e Ywmax
num viewport de limites Xvmin, Xvmax, Yvmin e Yvmax.
(consulte secção 5.4 do livro Computer Graphics do
Foley, Van Dam)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 25
Introdução ao OpenGL
Desenhando
Desenhandoformas
formasgeométricas
geométricas
#include <windows.h>
#include <gl/glut.h>

void RenderScene(void) // Called to draw scene


{
glClear(GL_COLOR_BUFFER_BIT); // Clear the window with current clearing color
glColor3f(1.0f, 0.0f, 0.0f); // Set current drawing color to red
glRectf(100.0f, 150.0f, 150.0f, 100.0f); // Draw a filled rectangle with current color
glFlush(); // Flush drawing commands
}
void Setup(void) // Setup the rendering state
{
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Desenhando
Desenhandoformas
formasgeométricas
geométricas(cont.)
(cont.)
void ChangeSize(GLsizei w, GLsizei h) // Called by GLUT library when the window has changed size
{ // Prevent a divide by zero
if(h == 0 h = 1;
glViewport(0, 0, w, h); // Set Viewport to window dimensions
glMatrixMode(GL_PROJECTION); // Reset coordinate system
glLoadIdentity();

// Establish clipping volume (left, right, bottom, top, near, far)


if (w <= h) glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0);
else glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main(void) // Main program entry point
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400,350);
glutInitWindowPosition(10,10);
glutCreateWindow("GLRect");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
Setup();
glutMainLoop();
}

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 26
Introdução ao OpenGL
Desenhando
Desenhandoformas
formasgeométricas
geométricas(cont.)
(cont.)
• void glutReshapeFunc (void (*func)(int width, int height));
Especifica a função a invocar quando a janela é criada, redimensionada ou transladada. (essa
função invoca glViewport para redefinir a área de ecrã e redefine a matriz de
projecção). Necessário garantir relações de aspecto iguais entre o viewport e a janela
de visualização (definida pelo volume de visualização)

• OpenGL possui dois tipos de Matrizes de Transformação: Projecção (afecta as


dimensões do volume de visualização) e Visualização (afecta os objectos da cena)

• glMatrixMode – define qual o tipo de matriz a ser utilizada em futuras


transformações

• Função glOrtho não define um volume de visualização mas sim uma matriz de
projecção definida pelos seus parâmetros a qual é multiplicada pela matriz de
projecção corrente.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Stacks
Stacksde
deMatrizes
Matrizes

void glPushMatrix (void); PUSH

Empurra todas as matrizes do stack corrente


um nível para baixo e a matriz do nível superior
é copiada, de modo que as duas primeiras
matrizes sejam iguais. Demasiadas operações de
push podem provocar a ocorrência de um erro.

void glPopMatrix (void);


POP
Retira a matriz do topo do stack e destrói o seu conteúdo.
Aquela que era a segunda matriz, passa a ocupar o topo do stack.
Esta operação gera um erro quando executada sobre um stack
com uma só matriz.
glMatrixMode selecciona o stack sobre o qual se pretende efectuar uma operação.

O stack ModelView tem tipicamente 32 níveis (importante para modelação hierárquica) e o


stack Projection apenas 2 níveis (geralmente não se efectua composição de projecções).

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 27
Introdução ao OpenGL
Utilização
Utilizaçãodo
doStack
Stack

//alteração ao código que desenhava um rectângulo para


// que este seja escalado
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 0.0f, 0.0f);
//Save the current modelview matrix by pushing
// the current transformation on the stack
glPushMatrix( );
// Scale Ex=1.5, Ey=0.5, Ez=1
glScalef(1.5,0.5,1);
glRectf(100.0f, 150.0f, 150.0f, 100.0f);
// Restore the modelview matrix by popping it
// of the matrix stack
glPopMatrix( );
glFlush();
}
©JAP, MRG & Instituto Superior Técnico, 2001/2002

Animação:um
Animação:umexemplo
exemplo

• Um simples programa de animação em que um


rectângulo se movimenta no ecrã.

• Ver o código em: Bounce_c.htm

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 28
Introdução ao OpenGL

Interacção
Interacção
(Cap. B2, pág. 41-44, B4, pág. 188-195,
B10, pág. 435-442, A7, pág. 255-270,
A13, pág. 531-552)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Interacção
Interacção

• APIs devem possibilitar o desenho de aplicações


gráficas interactivas
• OpenGL não suporta directamente a interacção
• Razão: portabilidade
• Solução: uso do toolkit GLUT que fornece a
funcionalidade mínima
• A GLUT “esconde” as complexidades inerentes às
interacções existentes entre o sistema de janelas, o
gestor de janelas e o sistema gráfico

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 29
Introdução ao OpenGL
Dispositivos
Dispositivosde
deentrada
entrada

• Dispositivos físicos: características particulares


• Dispositivos lógicos: propriedades são especificadas em
termos do que eles fazem na perspectiva da aplicação
(abstração de mais alto nível)
• Portanto: Dispositivos lógicos caracterizam-se pela
interface com o programa do utilizador e não pelas suas
características físicas

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Dispositivos
Dispositivosfísicos
físicosde
deentrada
entrada

• Dispositivos tipo apontador: indicam uma posição


no ecrã (ex: rato, trackball, joystick, lightpen, mesa
digitalizadora
• Dispositivos tipo teclado: devolvem um código de
caracteres (como o ASCII) ao programa (ex: teclado
de mesa)
• Os dispositivos tipo apontador podem ser de
posicionamento relativo (ex: rato) ou de
posicionamento absoluto (mesa digitalizadora ou
lightpen)
• Dispositivos 3D: spaceball (seis graus de liberdade),
luvas VR, etc.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 30
Introdução ao OpenGL
Dispositivos
Dispositivoslógicos
lógicosde
deentrada
entrada

• 2 características que descrevem o comportamento


lógico dos dispositivos de entrada (na perspectiva
da aplicação):
– Que medidas são fornecidas à aplicação?
– Em que instante são essas medidas fornecidas?
• 6 classes de dispositivos lógicos definidos pelo
GKS e PHIGS
• OpenGL não segue esta abordagem, uma vez que
nos modernos sistemas de janelas, a entrada de
informação não pode ser sempre dissociada
completamente das propriedades físicas dos
dispositvos de input

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Classes
Classesde
dedispositivos
dispositivoslógicos
lógicosde
deentrada
entrada
• String: devolve cadeias de caracteres ASCII. Usualmente é
implementado através de um teclado físico. OpenGL não os
distingue
• Locator: devolve uma posição em coord. do Mundo. OpenGL
associa a esta classe um dispositivo tipo apontador. Necessário
converter coord. de ecrã em coord. do Mundo.
• Pick: Devolve um identificador de um objecto. Utiliza-se geralmente
um dispositivo apontador mas com uma interface de software
específica. Em OpenGL utiliza-se o processo selection
• Choice: Seleccionar uma opção entre múltiplas escolhas. Em
OpenGL (GLUT) recorre-se à utilização de widgets tipo menus,
scrollbars e botões. Ex: menu com n opções
• Dial: entrada analógica. Em OpenGL, novamente utiliza-se widgets
como por exemplo as slidebars
• Stroke: Devolve um array de posições. Em OpenGL, isto
implementa-se através da pressão de um botão do rato, durante a
qual se procede à transferência de informação, e da libertação do
referido botão que corresponde ao fim dessa transferência

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 31
Introdução ao OpenGL
Medição
MediçãoeeTrigger
Trigger

• Medida: os dados que o dispositivo gera


• Trigger: propriedade física do dispositivo que é responsável
por enviar um sinal ao computador

• Exemplos:
– Teclado -> medidas: caracteres ASCII; trigger: tecla de enter
– Rato -> medidas: posições (x, y), trigger: botão

• Além da informação pretendida a medida pode incluir


informação adicional como, por exemplo, um estado: no caso
de um rato, se a medida for um id de um objecto (pick), há que
contemplar a possibilidade de o utilizador premir o botão sem
ter apontado para um objecto.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Modos
Modosde
deEntrada
Entrada

• A medida de um dispositivo pode ser obtida por três


modos distintos
• Um modo é definido pela relação entre o processo
de medida e o trigger. Normalmente a inicialização
de um dispositivo de entrada inicia o processo de
medida, cujos dados são guardados em buffers e
podem ser utilizados ou não pela aplicação

– Modo baseado em pedidos (request)


– Modo baseado em amostragem (sample):
» úteis em situações em que o programa “controla” o utilizador
– Modo baseado em eventos: utilizado em situações onde o
utilizador conduz ou controla o fluxo de execução do programa

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 32
Introdução ao OpenGL
Modos
Modosde
deEntrada
Entrada(cont.)
(cont.)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Modos
Modosde
deEntrada
Entrada(cont.)
(cont.)

• Modo baseado em pedidos (aplicações não-gráficas): a medida


não é devolvida ao programa até ao instante do disparo do
trigger. Ex: o programa detém-se na instrução scanf e aguarda
que o utilizador prima a tecla enter
• Modo baseado em amostragem: assim que a função é
chamada, a medida é enviada à aplicação. Não é necessário o
trigger.
• Os modos anteriores não permitem (ou é extremamente díficil)
gerir aplicações com múltiplas entradas e as quais controlam a
execução do programa (simulador de voo- não sabemos quais
os dispositivos que o piloto irá utilizar em qualquer instante da
simulação)
• Modo baseado em eventos: cada vez que utilizador realiza o
trigger do dispositivo é gerado um evento. Este pode ser
processsado de 2 modos:
– Guardado numa Fila de Eventos (event queue): GKS e Phigs
– Associação com uma função callback

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 33
Introdução ao OpenGL
Gestão
Gestãode
deEventos
Eventosem
emOpenGL
OpenGL

void glutDisplayFunc (void (*func)(void));

Especifica a função a invocar sempre que o conteúdo de uma janela tem de ser redesenhado.
(abertura, pop-up, objectos sobrepostos…)

void glutReshapeFunc (void (*func)(int width, int height));

Especifica a função a invocar quando a janela é redimensionada ou transladada. (essa função


invoca glViewport para redefinir a área de recorte e redefine a matriz de projecção)

void glutPostRedisplay (void);

Marca a janela corrente como necessitando de ser redesenhada (invocar glutDisplayFunc


logo que possível)

void glutKeyboardFunc (void (*func)(unsigned int key, int x, int y));

Especifica a função a invocar quando o operador prime uma tecla com um dado código ASCII.
X e Y indicam a posição do rato no instante da interacção.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Gestão
Gestãode
deEventos
Eventosem
emOpenGL
OpenGL(cont.)
(cont.)
• void glutSpecialFunc (void (*func)(unsigned int key, int x, int y));
• Estabelece a função callback que é chamada pela GLUT cada vez que uma tecla que gera
código
• não-ASCII é pressionada, tais como Home, End, PgUp, PgDn, F1 e F2. Os valores válidos:
• GLUT_KEY_F1, GLUT_KEY_F2, GLUT_KEY_F3, GLUT_KEY_F4, GLUT_KEY_F5,
• GLUT_KEY_F6, GLUT_KEY_F7, GLUT_KEY_F8, GLUT_KEY_F9, GLUT_KEY_F10,
• GLUT_KEY_F11, GLUT_KEY_F12, GLUT_KEY_LEFT, GLUT_KEY_UP,
• GLUT_KEY_RIGHT, GLUT_KEY_DOWN, GLUT_KEY_PAGE_UP,
• GLUT_KEY_PAGE_DOWN, GLUT_KEY_HOME, GLUT_KEY_END, GLUT_KEY_INSERT.

• void glutMouseFunc (void (*func)(int button, int state, int x, int y));
• Especifica a função a invocar quando um dos botões do rato (left, middle, right) é premido ou
• libertado. Três valores são válidos para o parâmetro button: GLUT_LEFT_BUTTON,
• GLUT_MIDDLE_BUTTON e GLUT_RIGHT_BUTTON. O parâmetro state pode ser
• GLUT_UP ou GLUT_DOWN. Os parâmetros x e y indicam a localização do mouse no
• momento que o evento ocorreu.

• void glutMotionFunc (void (*func)(int x, int y));


• Especifica a função a invocar quando o cursor controlado pelo rato se move dentro da
• janela, ao mesmo tempo que estão premidos um ou mais botões do mesmo. X e Y indicam
• a posição do cursor quando o evento ocorre

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 34
Introdução ao OpenGL
Programa
ProgramaInteractivo:
Interactivo:Exemplo
Exemplo
• Neste exemplo foram implementadas as seguintes interações: sempre que o
utilizador pressiona a tecla "R" ou "r", o rectângulo é exibido com a cor vermelha;
ao pressionar a tecla "G" ou "g" o retângulo é exibido com a cor verde; cada vez
que o utilizador clica com o botão esquerdo do mouse, o tamanho do rectângulo é
alterado; e cada vez que as teclas KEY_UP e KEY_DOWN são pressionadas ocorre
zoom-in e zoom-out, respectivamente.


    

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Listas
Listasde
deDesenho
Desenho

• Uma Lista de Desenho (Display List) é uma


sequência não editável de comandos GL que têm que
ser armazenados para posterior execução. Quando a
lista é criada os comandos podem ser só armazenados
ou também executados.
• Uma Lista de Desenho pode conter uma chamada a
outra Lista de Desenho (hierarquia de listas).
• Comandos que não possam ser armazenados são
executados imediatamente.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 35
Introdução ao OpenGL
OpenGL
OpenGLem
emModo
Modode
deRetenção:
Retenção:Display
DisplayLists
Lists

• Num mesmo programa é possível intercalar comandos openGL a executar em modo


imediato e comandos em modo de retenção, encapsulados em objectos gráficos: as
display lists.

• Uma display list é um grupo de comandos openGL, registados e organizados de uma forma
eficiente, para serem executados mais tarde, provocando o mesmo efeito que se obteria com
a sua execução em modo imediato.

• Uma display list regista apenas os comandos openGL invocados entre as chamadas às funções
glNewList e glEndList. Coordenadas e outras grandezas, correspondentes a argumentos
de comandos OpenGL, são registadas na display list com o valor que tinham quando a lista
estava a ser compilada.

Cada display list é identificada por um índice inteiro fornecido como argumento em
glNewList. Esse mesmo índice deve ser indicado quando se pretende executar uma display
list, através da função glCallList.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Criação
CriaçãoeeExecução
Execuçãode
deDisplay
DisplayLists
Lists

void glNewList (GLuint list, GLenum mode);

list: valor inteiro positivo que identifica univocamente uma display list

mode: GL_COMPILE: quando não se pretende que os comandos OpenGL sejam


executados enquanto são registados na display list
GL_COMPILE_AND_EXECUTE: quanto se pretende que os comandos
OpenGL sejam imediatamente executados
ao mesmo tempo que são registados.

void glEndList (void);

Estabelece o fim de uma display list

void glCallList (GLuint list);

Executa a display list identificada pelo valor de list. Os comandos são executados pela ordem
por que foram registados, tal como se fossem invocados em modo imediato.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 36
Introdução ao OpenGL
Display
DisplayLists:
Lists:alguns
algunsaspectos
aspectosrelevantes
relevantes

1. Optimizações do Desempenho

• Por questões de desempenho, uma display-list é uma cache de comandos e não um objecto
numa base de dados. Como consequência, as display-lists não são editáveis.

• Num ambiente distribuido, em que a aplicação se encontra numa máquina cliente e o processo
OpenGL reside numa máquina-servidora, as display-lists são armazenadas no servidor, com
consequente redução do tráfego da rede e aumento de desempenho.

• Mesmo em modo local, o mecanismo de display-list pode tornar-se mais eficiente dado que os
comandos podem ser pré-processados e armazenados da forma mais compatível possível com
as características do hardware gráfico de base (ex: cálculo dos coeficientes das matrizes de
transformação a partir dos parâmetros de transformação).

• Em certas implementações de OpenGL mais sofisticadas, pode mesmo proceder-se à fusão


de comandos adjacentes, como a concatenação de matrizes de transformação.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Display
DisplayLists:
Lists:alguns
algunsaspectos
aspectosrelevantes
relevantes(cont.)
(cont.)
2. O que se regista numa Display List
e como afecta o estado do sistema
• Os valores registados para os argumentos dos comandos de uma display-list, são os que
vigoravam na altura em que a display-list estava a ser compilada. Mesmo que se trate de uma
variável à qual se atribui posteriormente um outro valor, a display-list não é alterada.

• A execução de uma Display-List pode alterar o valor de variáveis de estado OpenGL e essas
alterações persistem após a execução da lista.

• Nem todos os comandos OpenGL podem ser registados numa display-list. Comandos que
involvam parâmetros por referência ou devolvam um valor, não são registados dado que a
lista pode ser executada fora do contexto em que determinadas variáveis foram definidas.
Esses comandos são executados como se fossem invocados em modo imediato.

3. Display Lists Hierárquicas


• Podem criar-se display-lists hierárquicas, executando outras listas no corpo de uma lista inicial.
Se pretendermos memorizar o estado do sistema antes de executar uma sub-lista e repôr esse
mesmo estado após a sua execução, há que efectuar operações explícitas de push e pop de
matrizes e atributos (glPushMatrix, glPushAttrib, glPopMatrix, glPopAttrib)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 37
Introdução ao OpenGL
Display
DisplayLists:
Lists:exemplo
exemplo
#define MY_CIRCLE_LIST 1

void build_circle (void)


{
Glint i,
Glfloat cosine, sine;

glNewList (MY_CIRCLE_LIST, GL_COMPILE);


glBegin(GL_POLYGON);
for(i=0, i<100, i++) {
cosine=cos(i*2*PI/100.0);
sine=sin(i*2*PI/100.0);
glVertex2f(cosine, sine);
}
glEnd;
glEndList();
}

Observações: as funções C não são guardadas. As coordenadas dos pontos são


calculadas e copiadas para a display list (compilação)
Para invocar esta display list basta fornecer o seguinte comando:
glCallList(MY_CIRCLE_LIST);

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Gestão
Gestãode
deListas
Listaseeseus
seusÍndices
Índices
A utilização directa e indiscriminada de índices para as listas a criar pode provocar efeitos
indesejados, como o apagamento de uma lista, por utilização indevida do seu índice.

GLuint glGenLists (Glsizei range);

Aloca um número (range) de índices de display-lists contíguos e não utilizados.


O valor de retorno corresponde ao índice que marca o início da série.
Posteriores invocações desta função não devolvem os mesmos índices, a menos que tenham
sido entretanto apagados.

GLboolean glIsList (Gluint list);

Retorna TRUE se o valor list corresponder a um índice correntemente utilizado e FALSE


caso contrário.

Void glDeleteLists (GLuint list, Glsizei range);

Destroi um número range de listas, começando pelo índice especificado por list. A tentativa
de apagar uma lista inexistente não produz qualquer efeito.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 38
Introdução ao OpenGL
Selecção
Selecçãode
deObjectos
Objectos

• Em aplicações interactivas é fundamental que o sistema gráfico de base forneça um


qualquer mecanismo de selecção de objectos ou partes de objectos presentes numa cena.

• O OpenGL fornece um mecanismo de selecção que automaticamente identifica os objectos


que são desenhados sobre uma determinada região da janela corrente.

• É possível integrar e completar esse mecanismo numa função que permita identificar o objecto
ou objectos seleccionados pelo utilizador através de um cursor gráfico (“picking”).

Objectos

Cursor

Janela
de Pick

©JAP, MRG & Instituto Superior Técnico, 2001/2002

OOModo
Modode
deOperação
Operação“Selection”
“Selection”

• Para utilizar o mecanismo de selecção do OpenGL começa-se por desenhar a cena no


frame-buffer, comutar em seguida para o modo de operação “Selection” e invocar de novo
os comandos necessários ao redesenho de toda a cena.

• Em modo “Selection”, o conteúdo do frame-buffer não é alterado, não obstante serem invocadas
operações de desenho

• Quando se abandona o modo “Selection”, o sistema devolve um registo de todas as primitivas


que teriam intersectado o volume de visualização (definido pelas transformações Projection
e pelos planos de recorte adicionais), caso tivessem sido desenhadas.

• Cada primitiva nessas condições gera um “selection hit”. Cada “selection hit” regista um
conjunto de nomes (valores inteiros) identificadores da primitiva e outros dados com ela
relacionados -“hit record”. Os vários “hit records” são armazenados num mesmo array.

• O conjunto de identificadores inteiros registado para cada primitiva corresponde aos valores
que estão presentes num stack de nomes (“name stack”) no instante em que é dada a ordem de
desenho da primitiva. O conteúdo desse stack deve ir sendo alterado entre sucessivos comandos
de desenho, de modo a distinguir diferentes primitivas (a identificação é hierárquica).

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 39
Introdução ao OpenGL
Passos
Passospara
paraaaactivação
activaçãodo
doModo
Modode
deSelecção
Selecção

1) Especificar o array a utilizar para o registo dos “selection hits”

void glSelectBuffer (GLsizei size, GLuint *buffer);

size: número máximo de valores que podem ser armazenados


buffer: ponteiro para um array de “unsigned integers”

2) Activar o modo “Selection” por invocação da função glRenderMode com o valor GL_SELECT

GLint glRenderMode (GLenum mode); /* por defeito GL_RENDER */

Quando se comuta de GL_SELECT para GL_RENDER o valor devolvido


pela função indica o número de “selection hits” que foram registados.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Passos
Passospara
paraaaactivação
activaçãodo
doModo
Modode
deSelecção
Selecção(cont.)
(cont.)
3) Inicializar o stack de nomes recorrendo às funções glInitNames e glPushName

void glInitNames (void);

Cria um Stack de Nomes vazio

void glPushName (Gluint name);

Através de uma operação de push, acrescenta uma entrada ao stack, com o valor
“name”.
Convém efectuar uma operação de push logo na fase de inicialização para que haja
pelo menos uma entrada cujo valor pode depois ser redefinido por glLoadName.

4) Definir o Volume de Visualização (“View Volume”) que se pretende utilizar para efeitos
de selecção

Sendo geralmente diferente do volume que se utiliza para efeitos de visualização, o estado
das transformações deve ser gravado e reposto antes e depois do processo de selecção,
com as funções glPushMatriz e glPopMatrix

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 40
Introdução ao OpenGL
Passos
Passospara
paraaaactivação
activaçãodo
doModo
Modode
deSelecção
Selecção(cont.)
(cont.)
5) Alternar comandos de desenho de primitivas com comandos de manipulação do
stack de nomes.

/* Com um só nível hierárquico */


glInitNames ( ); Os comandos glPushName, glPopName e
glPushName (-1); glLoadName são ignorados se não se
…… estiver em modo de selecção. O mesmo
glLoadName (1); código de desenho pode ser usado para
drawOneObject (); “Rendering” ou “Selection”
glLoadName (2);
drawAnotherObject ();
glLoadName (3);
drawYetAnotherObject ();

6) Abandonar o Modo “Selection” e processar a informação armazenada no array de


“Selection Hits”. Cada “hit” regista os seguintes ítens:
• O número de nomes presentes no stack de nomes na altura em que o “hit” aconteceu
• Valores mínimo e máximo em z de todos os vértices da primitiva que intersectou o view-volume
• Todos os valores contidos no stack de nomes na altura em que se deu o “hit”, começando pelo
elemento do nível inferior.
©JAP, MRG & Instituto Superior Técnico, 2001/2002

Operação
Operaçãode
dePick
Pickcom
combase
baseno
noMecanismo
Mecanismode
deSelecção
Selecção

Utilizar uma Matriz de Picking, em conjugação com a matriz de projecção para restringir a
selecção de primitivas a uma pequena região do viewport, tipicamente centrada na posição
indicada por um cursor.

Regras a considerar:

1) A rotina que define a Matriz de Pick deve ser invocada antes da definição da Projecção

2) A operação de pick é geralmente despoletada a partir de um evento proveniente de um


dispositivo de interacção de tipo locator.

void gluPickMatrix (GLdouble x, GLdouble y, GLdouble width, GLdouble height,


GLint viewport [4] );

x, y: centro da região de pick em coordenadas da janela (posição do cursor)


width, height: dimensões da região de pick em coordenadas do ecrã (sensibilidade)
viewport: limites do viewport corrente

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 41
Introdução ao OpenGL
Transformações
TransformaçõesInversas
Inversas

• Para efectuar o pick é necessário obter, a partir


de coordenadas 2D da imagem de um vértice, a
respectiva localização 3D. Com algumas
restrições (por exemplo matriz que não se pode
inverter) a função gluUnProject efectua essa
operação.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

4-Cor
4-Cor ee Iluminação
Iluminação
(Cap. A4, pág. 167-172 e A5, pág. 177-
190 e 197-215)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 42
Introdução ao OpenGL
Definição
Definiçãode
deCor
Cor

• Modelo RGB e A (transparência) sendo


possível interrogar o número de planos
existentes para cada canal (R,G,B,A).
• Pode ser definida cor de modo directo ou
indexado (entrada numa Tabela de Cores).

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Propriedades
PropriedadesMateriais
Materiais

• Pode definir-se propriedades das faces dianteiras


e traseiras (ou de ambas) dos polígonos através
dos seguintes parâmetros:
– Cores ambiente e difusa;
– Cor especular e respectivo expoente de brilho;
– Cor de emissão (fonte de energia luminosa).

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 43
Introdução ao OpenGL
Modelos
Modelosde
deSombreamento
Sombreamento

• Podem ser definidos os Modelos de


Sombreamento
– Constante
– Gouraud (por omissão)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Cálculos
Cálculosde
deIluminação
Iluminação
• Descreve-se a luz proveniente das fontes e a iluminação da superfície dos objectos com base
num modelo cromático RGB.
• A côr de uma fonte de luz é definida pela percentagem (0 a 1) de luz vermelha, verde e azul
que emite.
• Os materiais constituintes das superfícies a iluminar são caracterizados pela percentagem de
luz vermelha, verde e azul recebida, que voltam a reflectir segundo variadas direcções.

• Uma mesma cena pode ser iluminada por mais que uma fonte de luz. Cada uma dessas fontes
pode ser activada ou desactivada independentemente das restantes.
• Parte da luz provêm directamente das fontes de luz, de uma direcção e posição definidas, e
parte provêm de direcção indefinida, como resultado de múltiplas reflexões da luz, proveniente
das fontes, sobre os objectos da cena (luz ambiente).
• Pode definir-se uma componente de luz ambiente global, para a qual não é possível identificar
sequer a fonte de origem.

• A iluminação de um objecto resulta da soma de 4 componentes distintas: luz emitida, luz


ambiente, luz difundida e luz reflectida ou especular.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 44
Introdução ao OpenGL
As
AsVárias
VáriasComponentes
Componentesde
deLuz
Luz

Luz Emitida:
Luz emitida pela própria superfície do objecto, não afectada
por qualquer fonte de luz.
Luz Ambiente:
Luz proveniente de todas as direcções (devido a múltiplas
reflexões na cena) e reflectida pela superfície em todas as
direcções.
Luz Difundida:
Luz proveniente de uma direcção bem definida e reflectida
igualmente segundo todas as direcções. A quantidade de luz
reflectida depende do ângulo de incidência da luz na superfície.
O brilho da superfície não depende da direcção de observação.
Luz Especular:
Luz proveniente de uma direcção bem definida e que tende a
reflectir-se em torno de uma direcção preferencial. O brilho da
superfície depende da direcção de observação.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Conjugação
Conjugaçãodas
dasPropriedades
Propriedadesdas
dasFontes
Fonteseedos
dosMateriais
Materiais
• As Fontes de Luz
Embora uma fonte real emita luz numa só distribuição de frequências, o OpenGL considera
valores de R G B diferentes para as componentes ambiente, difusa e especular (valores LR,
LG, LB no intervalo [0, 1] ).
• Os Materiais
Para os materiais definem-se valores de R, G, B (MR, MG, MB no intervalo [0,1]), um conjunto
para cada uma das componentes de luz reflectida: ambiente, difusa e especular.
• A Luz Reflectida por Componente
A luz reflectida por um objecto, em cada uma das diferentes componentes, é dada pelo produto
entre os correspondentes valores de R, G, B da fonte de luz e do material:
(LR * MR, LG * MG, LB * MB)
• A Iluminação Total
A iluminação de um objecto, ou seja, a totalidade da luz que nele se reflecte e atinge a vista do
observador obtém-se somando entre si os valores R G B de cada componente de reflexão.
(R1+R2 + … + Rn, G1 + G2 + … + Gn, B1 + B2 + … + Bn )
O resultado de cada soma é truncado ao valor 1, correspondente ao máximo de intensidade.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 45
Introdução ao OpenGL
Representação
Representaçãode
deuma
umaCena
Cenacom
comIluminação
Iluminação

Para obter, em openGL, a representação de uma cena com cálculos de iluminação, há que
efectuar, necessariamente, os seguintes passos:

1) Definir, para todos os objectos presentes na cena, os vectores normais a cada um dos seus
vértices.

2) Criar, posicionar e seleccionar uma ou mais fontes de luz.

3) Definir os parâmetros do modelo de iluminação (características, como o


nível de luz ambiente global e a localização efectiva do ponto de observação).

4) Definir, para todos os objectos presentes na cena, as propriedades ópticas dos respectivos
materiais.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Criação
CriaçãoeeActivação
Activaçãode
deFontes
Fontesde
deLuz
Luz

1) Sucessivas invocações da função glLight*() permitem estabelecer diferentes características


para uma dada fonte de luz

glLight{if}[v] (Glenum light, Glenum pname, TYPE param);

light: índice da fonte a parametrizar (GL_LIGHT0, GL_LIGHT1, …, GL_LIGHT7)


pname: indicação da característica que se pretende definir
param: valor a atribuir à característica seleccionada

2) Deve preparar-se o sistema para executar cálculos de iluminação


glEnable (GL_LIGHTING);

3) Deve activar-se uma ou mais fontes de luz previamente parametrizadas


glEnable (lightIndex);

4) Os cálculos de iluminação devem ser complementados com cálculos de remoção de superfícies


ocultas.
glEnable (GL_DEPTH_TEST);

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 46
Introdução ao OpenGL
Propriedades
Propriedadesde
deuma
umaFonte
Fontede
deLuz
Luz

• GL_AMBIENT: valores RGBA para a intensidade da luz ambiente


• GL_DIFFUSE: valores RGBA para a intensidade da luz difusa
• GL_SPECULAR: valores RGBA para a intensidade da luz especular
• GL_POSITION: (x, y, z, w) se w = 0, fonte de luz direccional: posição infinita e
direcção dada por (x, y, z)
se w = 1, fonte de luz posicional, com posição dada
por (x, y, z) em coord. de objecto. Raios divergentes.

• GL_SPOT_DIRECTION: cutoff

• GL_SPOT_EXPONENT: direction

• GL_SPOT_CUTOFF: exponent
cos (θ)

1
• GL_CONSTANT_ATTENUATION (Kc): attenuation factor =
Kc + Kl.d + Kq.d2
• GL_LINEAR_ATTENUATION (Kl):
d: distância da fonte ao vértice
• GL_QUADRATIC_ATTENUATION (Kq):

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Fontes
Fontesde
deLuz
LuzeeTransformações
Transformações

• O openGL trata a posição e direcção de uma fonte de luz da mesma forma que trata a
informação geométrica das primitivas gráficas.

• Os valores da posição e direcção de uma fonte, estabelecidos através da função glLight (), são
transformados por aplicação da Transformação ModelView corrente e guardados em
coordenadas de vista (eye coordinates).

• Assim, a posição e direcção de uma fonte de luz pode ser manipulada por alteração da matriz
ModelView.

• Para criar uma fonte de luz que se mova com o ponto de observação, basta definir a posição e
orientação da fonte antes de estabelecer a transformação de visualização. Assim, os parâmetros
ficam directamente definidos em coordenadas de vista (a posição relativa da fonte e da câmara
não muda)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 47
Introdução ao OpenGL
Modelo
Modelode
deIluminação
Iluminação

• O Modelo de Iluminação tem os seguintes


parâmetros:
– Intensidade da luz ambiente;
– Posição do ponto de vista local ou no infinito
(especular versus difuso);
– Cálculo diferente para as faces dianteiras e traseiras;
– Se a componente especular deve ser aplicada após o
mapeamento de texturas (brilho).

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Parametrização
Parametrizaçãodo
doModelo
Modelode
deIluminação
Iluminação

• Luz Ambiente Global


Valores de RGBA para a intensidade da luz ambiente que não é possível relacionar com uma
dada fonte de luz. Graças a esta componente luminosa, é possível visualizar os objectos
presentes na cena mesmo que não se defina qualquer fonte de luz.

Glfloat ambient_light [ ] = { 0.2, 0.2, 0.2, 1.0}


glLightModelfv (GL_LIGHT_MODEL_AMBIENT, ambient_light);

• Ponto de Observação Infinito ou Local


Com o ponto de observação no infinito, a direcção de visualização é igual em todos os vértices da
cena, o que simplifica os cálculos de iluminação (situação por defeito). Com um ponto de
observação finito essa direcção varia (e torna mais realistas o cálculo das regiões especulares).
glLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE

• Iluminação por Tipo de Faceta


Decidir se são efectuados cálculos de iluminação para backfaces depois de invertidos os seus
vectores normais (caso afirmativo, podem definir-se materiais diferentes para front e backfaces).
glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 48
Introdução ao OpenGL
Definição
Definiçãodas
dasPropriedades
Propriedadesdos
dosMateriais
Materiais

Sucessivas invocações da função glMaterial*() permitem estabelecer as diferentes características


ópticas do material corrente.

glMaterial{if}[v] (Glenum face, Glenum pname, TYPE param);

face: tipos de facetas considerados (GL_FRONT, GL_BACK, GL_FRONT_AND_BACK)


pname: indicação da característica que se pretende definir
param: valor a atribuir à característica seleccionada

• GL_AMBIENT: percentagens RGBA para a luz ambiente reflectida


• GL_DIFFUSE: percentagens RGBA para a luz difusa reflectida
• GL_AMBIENT_AND_DIFFUSE: mesmos RGBA para componentes ambiente e difusa

• GL_SPECULAR: percentagens RGBA para a luz especular reflectida


• GL_SHININESS: grau de especularidade do material (0 a 128). Quanto
maior o valor, mais pequena e brilhante a zona especular
• GL_EMISSION: valores RGBA para a intensidade da luz emitida pelo
próprio material (Não influencia a iluminação de outros
objectos, ou seja, não actua como fonte de luz)

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Método
MétodoAlternativo
Alternativode
deDefinição
Definiçãode
dePropriedades
Propriedades

• Invocações à função glColorMaterial permitem definir, para determinados tipos de faces, quais
as propriedades ópticas de um material que herdam automaticamente os valores da côr de
desenho corrente, definida por glColor.

glColorMaterial (GLenum face, Glenum mode);

face: tipos de facetas considerados (GL_FRONT, GL_BACK, GL_FRONT_AND_BACK)


mode: selecção de uma propriedade susceptível de ser definida por um grupo RGBA

• Para que o efeito de glColorMaterial se faça sentir, é necessário activar uma variável de estado:

glEnable (GL_COLOR_MATERIAL);

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 49
Introdução ao OpenGL
AAMatemática
Matemáticados
dosCálculos
Cálculosde
deIluminação
Iluminação
Em modo cromático RGBA, os cálculos necessários à determinação da côr a atribuir a
um dado vértice são:

VertexColor = emission material +

ambient lightmodel * ambient material +


n -1
∑ [ 1 / ( Kc + Kl.d + Kq.d2 ) ]i * (spotlight_effect) i *
i=0
[ ambient light * ambient material +

(max {l . n, 0}) * diffuse light * diffuse material +

(max {s . n, 0}) shininess * specular light * specular material ]i

n: versor normal ao vértice


l: versor que aponta do vértice para a fonte de luz
s: versor na direcção da soma entre l e o vector que une o vértice ao ponto de observação

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Demonstração
Demonstraçãolight
light&
&material
material

Usar a aplicação light & material para mostrar o efeito


da alteração de:
• Componentes de iluminação;
• Materiais;
• Atenuação da intensidade luminosa;
• Aplicação da iluminação às duas faces de polígonos
(usar a rosa).

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 50
Introdução ao OpenGL
Demonstração
Demonstraçãotexture
texture

Usar a aplicação texture para mostrar:


• Várias texturas;
• Aplicação de texturas a objectos 3D;
• Desempenho necessário;
• Transformações 3D.

©JAP, MRG & Instituto Superior Técnico, 2001/2002

Página 51

Você também pode gostar