Escolar Documentos
Profissional Documentos
Cultura Documentos
1-Introdução
1-Introdução ao
ao OpenGL
OpenGL
Prof. João Madeiras Pereira e Mário Rui
Gomes
Bibliografia
Bibliografia
Página 1
Introdução ao OpenGL
Programa
Programa
Abordagem
Abordagem
Página 2
Introdução ao OpenGL
OpenGL
OpenGL
(Bibliotecas,
(Bibliotecas, Exemplos
Exemplos de
de Utilização,
Utilização, Pipelines)
Pipelines)
O
O OpenGL
OpenGL
Página 3
Introdução ao OpenGL
Pipeline
PipelineRevisitado
Revisitado
Pipeline
PipelineOpenGL
OpenGLSimples
Simples
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
Vértices
Vérticesee Quadrículas
Quadrículas
Página 5
Introdução ao OpenGL
Lista
Lista de
deDesenho
Desenho
Avaliadores
Avaliadores
Página 6
Introdução ao OpenGL
Operações
Operaçõessobre
sobrevértices
vértices
Assemblar
Assemblar Primitivas
Primitivas
Página 7
Introdução ao OpenGL
Operações
Operaçõessobre
sobreQuadrículas
Quadrículas
Assemblar
Assemblar Texturas
Texturas
Página 8
Introdução ao OpenGL
Discretização
Discretização
Operações
Operaçõessobre
sobreFragmentos
Fragmentos
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
Convenção
Convenção p/
p/ comandos
comandos OpenGL
OpenGL
• <PrefixoBiblioteca> <ComandoRaiz>
<NúmeroArgumentosOpcional> <TipoArgumentosOpcional>
• Exemplos:
– glColor3f
– glColor3i
– glColor3d
Página 10
Introdução ao OpenGL
Bibliotecas
Bibliotecas
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)
Página 11
Introdução ao OpenGL
Biblioteca
Bibliotecaglut
glut
Biblioteca
Bibliotecawgl
wgl
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:
!
"
!
"
!
"##
## $#""#
$#""#
#""#
%!
%!
%!
%!
%!
!
"
!
"
!
"##
## &'!
&'!
'!
Demonstração
DemonstraçãoFog
Fog
Página 13
Introdução ao OpenGL
Primeiro
PrimeiroPrograma
Programa
#include <windows.h>
#include <GL/glut.h>
Funções
FunçõesGLUT
GLUTutilizadas
utilizadas
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
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:
Página 15
Introdução ao OpenGL
Tipos
Tiposde
de
Primitivas
PrimitivasGeométricas
Geométricas
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
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 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)
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, …)
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);
Página 17
Introdução ao OpenGL
Alguns
AlgunsAtributos
AtributosGráficos
Gráficos
Vértices
Vértices
Página 18
Introdução ao OpenGL
Transformações
TransformaçõesGeométricas
Geométricas
Desenho
Desenhode
deObjectos
Objectos
Página 19
Introdução ao OpenGL
Rasterização
Rasterizaçãode
deLinhas
Linhas
Rasterização
Rasterizaçãode
dePolígonos
Polígonos
Página 20
Introdução ao OpenGL
Demonstração
Demonstraçãoshapes
shapes
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).
Vertex
ModelView
ModelView Projection
Projection Perspective
Perspective Viewport
Viewport
Matrix
Matrix Matrix
Matrix Division
Division Transformation
Transformation
Página 21
Introdução ao OpenGL
AADefinição
Definiçãode
deTransformações
Transformações
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 ()).
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:
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.
Página 22
Introdução ao OpenGL
Definir
DefiniraaTransformação
Transformaçãode
deVisualização
Visualização
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 ()
top
left
right
Nota: Com esta função é possível definir
bottom
um Volume de Visualização assimétrico
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 ()
aspect = w / h near
far
bottom
near far
Demonstração
Demonstraçãoprojection
projection
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.
Mapeamento
Mapeamentojanela-viewport
janela-viewport
Página 25
Introdução ao OpenGL
Desenhando
Desenhandoformas
formasgeométricas
geométricas
#include <windows.h>
#include <gl/glut.h>
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();
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)
• 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.
Stacks
Stacksde
deMatrizes
Matrizes
Página 27
Introdução ao OpenGL
Utilização
Utilizaçãodo
doStack
Stack
Animação:um
Animação:umexemplo
exemplo
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)
Interacção
Interacção
Página 29
Introdução ao OpenGL
Dispositivos
Dispositivosde
deentrada
entrada
Dispositivos
Dispositivosfísicos
físicosde
deentrada
entrada
Página 30
Introdução ao OpenGL
Dispositivos
Dispositivoslógicos
lógicosde
deentrada
entrada
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
Página 31
Introdução ao OpenGL
Medição
MediçãoeeTrigger
Trigger
• Exemplos:
– Teclado -> medidas: caracteres ASCII; trigger: tecla de enter
– Rato -> medidas: posições (x, y), trigger: botão
Modos
Modosde
deEntrada
Entrada
Página 32
Introdução ao OpenGL
Modos
Modosde
deEntrada
Entrada(cont.)
(cont.)
Modos
Modosde
deEntrada
Entrada(cont.)
(cont.)
Página 33
Introdução ao OpenGL
Gestão
Gestãode
deEventos
Eventosem
emOpenGL
OpenGL
Especifica a função a invocar sempre que o conteúdo de uma janela tem de ser redesenhado.
(abertura, pop-up, objectos sobrepostos…)
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.
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.
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.
Listas
Listasde
deDesenho
Desenho
Página 35
Introdução ao OpenGL
OpenGL
OpenGLem
emModo
Modode
deRetenção:
Retenção:Display
DisplayLists
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.
Criação
CriaçãoeeExecução
Execuçãode
deDisplay
DisplayLists
Lists
list: valor inteiro positivo que identifica univocamente uma display 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.
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).
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.
Página 37
Introdução ao OpenGL
Display
DisplayLists:
Lists:exemplo
exemplo
#define MY_CIRCLE_LIST 1
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.
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.
Página 38
Introdução ao OpenGL
Selecção
Selecçãode
deObjectos
Objectos
• É 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
OOModo
Modode
deOperação
Operação“Selection”
“Selection”
• Em modo “Selection”, o conteúdo do frame-buffer não é alterado, não obstante serem invocadas
operações de desenho
• 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).
Página 39
Introdução ao OpenGL
Passos
Passospara
paraaaactivação
activaçãodo
doModo
Modode
deSelecção
Selecção
2) Activar o modo “Selection” por invocação da função glRenderMode com o valor GL_SELECT
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
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
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.
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
Página 41
Introdução ao OpenGL
Transformações
TransformaçõesInversas
Inversas
4-Cor
4-Cor ee Iluminação
Iluminação
(Cap. A4, pág. 167-172 e A5, pág. 177-
190 e 197-215)
Página 42
Introdução ao OpenGL
Definição
Definiçãode
deCor
Cor
Propriedades
PropriedadesMateriais
Materiais
Página 43
Introdução ao OpenGL
Modelos
Modelosde
deSombreamento
Sombreamento
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.
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.
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.
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.
4) Definir, para todos os objectos presentes na cena, as propriedades ópticas dos respectivos
materiais.
Criação
CriaçãoeeActivação
Activaçãode
deFontes
Fontesde
deLuz
Luz
Página 46
Introdução ao OpenGL
Propriedades
Propriedadesde
deuma
umaFonte
Fontede
deLuz
Luz
• 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):
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)
Página 47
Introdução ao OpenGL
Modelo
Modelode
deIluminação
Iluminação
Parametrização
Parametrizaçãodo
doModelo
Modelode
deIluminação
Iluminação
Página 48
Introdução ao OpenGL
Definição
Definiçãodas
dasPropriedades
Propriedadesdos
dosMateriais
Materiais
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.
• Para que o efeito de glColorMaterial se faça sentir, é necessário activar uma variável de estado:
glEnable (GL_COLOR_MATERIAL);
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:
Demonstração
Demonstraçãolight
light&
&material
material
Página 50
Introdução ao OpenGL
Demonstração
Demonstraçãotexture
texture
Página 51