introdu..o ao opengl - técnico lisboa - autenticação · • polígonos planares (para que a sua...

101
©JAP & Instituto Superior Técnico 1-Introdução ao OpenGL Prof. João Madeiras Pereira

Upload: doanthuan

Post on 08-Oct-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

1-Introdução ao OpenGL1-Introdução ao OpenGL

Prof. João Madeiras Pereira

Page 2: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

BibliografiaBibliografia

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

B) Computer Graphics – Principles and

Practice (Foley, Van Dam)

Page 3: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

ProgramaPrograma

• 1- OpenGL (Bibliotecas, Exemplos de Utilização, Pipelines) (Cap. A1, pág. 1-23)

• 2-Desenho de Objectos Geométricos, Transformações Geométricas e Animação) (Cap. A1, pág. 20-25, A2, pág. 29-59, A3)

• 3- Interacção (event-driven input, display-lists, Menus, Picking) (Cap. B2, pag. 41-44, B4, pag. 188-195, B10, pag. 435-442, A7, pág. 255-270, A13, pag. 531-552)

• 4-Cor e Iluminação (Cap. A4 e A5)

Page 4: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

AbordagemAbordagem

• 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.

Page 5: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

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

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

Page 6: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

O OpenGLO 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

Page 7: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Pipeline RevisitadoPipeline Revisitado

Transf. Modelação e Visualização

Modelos 3D

ProjecçãoPrimitivas 3D

Coordenadas 3D do Modelo

Coordenadas 3D do Mundo

DiscretizaçãoPrimitivas 2DCoordenadas 2D Normal.

Criação da ImagemQuadrículasCoordenadas 2D

Page 8: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Pipeline OpenGL Simples Pipeline OpenGL Simples

Versão simplificada do pipeline OpenGL

Page 9: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Pipeline OpenGLPipeline OpenGL

DisplayList

Evaluators

Per-VertexOperations

andPrimitiveAssembly

PixelOperations

Rasterization Per-FragmentOperations

Framebuffer

TextureAssembly

VertexData

PixelData

Page 10: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Vértices e QuadrículasVértices e 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.

Page 11: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Lista de DesenhoLista de 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).

Page 12: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

AvaliadoresAvaliadores

• 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

Page 13: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Operações sobre vérticesOperações sobre 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);

Page 14: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Assemblar PrimitivasAssemblar 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.

Page 15: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Operações sobre QuadrículasOperações sobre 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.

Page 16: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Assemblar TexturasAssemblar Texturas

• Várias texturas, descritas através de pixelmapspodem 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.

Page 17: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

DiscretizaçãoDiscretizaçã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.

Page 18: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Operações sobre FragmentosOperações sobre 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.

Page 19: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Tipos de Dados OpenGLTipos de Dados OpenGL

Tipo de dado OpenGL

Representação interna

Tipo de dado C equivalente Sufixo

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

GLubyte, GLboolean 8-bit unsigned integer unsigned char ub

GLushort 16-bit unsigned integer unsigned short us

GLuint, GLenum, GLbitfield

32-bit unsigned integer

unsigned long ou unsigned int ui

• Portabilidade facilitada com a definição de tipos de dados OpenGL

Page 20: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

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

• <PrefixoBiblioteca> <ComandoRaiz> <NúmeroArgumentosOpcional> <TipoArgumentosOpcional>

• Exemplos:– glColor3f– glColor3i– glColor3d

Page 21: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

BibliotecasBibliotecasToolkit de Alto Nível (Fahrenheit Scene

Graph)

Utility Library

Sistema de Gestão de Janelas

OpenGL

Utility Toolkit

glu

glglut

glx, wgl,agl

Page 22: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Biblioteca gluBiblioteca 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)

Page 23: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Biblioteca glut Biblioteca 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.)!

Page 24: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Biblioteca wgl Biblioteca 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.

Page 25: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Máquina de EstadosMáquina de 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:int luz; : glEnable(GL_LIGHTING); //Activa ilumninação: luz = glIsEnabled(GL_LIGHTING); // retorna 1 (verdadeiro) :glDisable(GL_LIGHTING); //Desactiva iluminação

: luz = glIsEnabled(GL_LIGHTING); // retorna 0 (falso) :

Page 26: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Demonstração FogDemonstração FogUsar 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.

Page 27: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Primeiro ProgramaPrimeiro 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 colorglFlush(); // Flush drawing commands

}

void Setup(void) // Setup the rendering state{

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

// Main program entry pointvoid main(void){

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutCreateWindow("Simple");glutDisplayFunc(RenderScene);Setup();glutMainLoop();

}

Page 28: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Funções GLUT utilizadasFunções GLUT 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 seuidentificador

• 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.

Page 29: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

2-Desenho de Objectos Geométricos, Transformações e Animação

2-Desenho de Objectos Geométricos, Transformações e Animação

(Cap. A1, pág. 20-25, Cap. A2, pág. 29-59 e Cap. A3)

Page 30: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Desenhando uma PrimitivaDesenhando uma 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 (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 deuma primitiva com o tipo seleccionado em glBegin.

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

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

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

glColor (), glIndex () definem a côrglNormal () define o vector normal ao vérticeglTextCoord () define uma coordenada de texturaglMaterial () define propriedades ópticas do material

glColor (), glIndex () definem a côrglNormal () define o vector normal ao vérticeglTextCoord () define uma coordenada de texturaglMaterial () define propriedades ópticas do material

Page 31: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Tipos dePrimitivas Geométricas

Tipos dePrimitivas 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)

Page 32: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Primitivas Gráficas SimplesPrimitivas Gráficas Simples

v0v1

v2v3

v4

GL_POINTS GL_LINES

v0

v1v2

v3v4

v5v6v7

GL_LINE_STRIP

v0

v1

v2

v3v4

GL_LINE_LOOPv0 v1

v2v3

v4

v0

v1

v2 v3

v4 v5

GL_TRIANGLES

v0

v1

v2

v3

v4

v5

GL_TRIANGLE_STRIP GL_TRIANGLE_FAN

v0

v1 v2

v3

v4

GL_POLYGONGL_QUAD_STRIPGL_QUADS

v0

v1 v2

v3v4

v5

v6

v7 v0

v1

v2

v3

v4

v5

v6

v7 v0

v1

v2v3

v4

Page 33: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Restrições à Definição de PolígonosRestrições à Definição de 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 doponto de observação)

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

• 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 doponto de observação)

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

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

Page 34: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Gestão de Estado e Atributos GráficosGestão de Estado e Atributos 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 afectama 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.

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 afectama 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 estadobooleanas: (GL_DEPTH_TEST, GL_FOG, GL_LIGHTING, …)Existem funções para activar (ON), desactivar (OFF) e interrogar variáveis de estadobooleanas: (GL_DEPTH_TEST, GL_FOG, GL_LIGHTING, …)

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

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 maiscomplexas (GL_CURRENT_COLOR, GL_CURRENT_NORMAL, etc..)Um outro conjunto de funções permite obter o valor corrente de variáveis de estado maiscomplexas (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);

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);

Page 35: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Alguns Atributos GráficosAlguns Atributos 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

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

Page 36: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

VérticesVé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.

Page 37: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Transformações GeométricasTransformações 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 existeum gestor de stack de matrizes.

• Podem ser usados 6 planos adicionais de recorte.

Page 38: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Desenho de Objectos Desenho de 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

Page 39: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Rasterização de LinhasRasterização de 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.

Page 40: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Rasterização de PolígonosRasterização de 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.

Page 41: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Demonstração shapesDemonstração shapesUsar 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).

Page 42: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Transformações Geométricas no PipelineTransformações Geométricas no Pipeline

Numa perspectiva de Câmara Virtual, a definição das transformações necessárias aoposicionamento da câmara (visualização) e disposição dos objectos na cena (modelação)faz-se, geralmente, na seguinte sequência:

Numa perspectiva de Câmara Virtual, a definição das transformações necessárias aoposicionamento 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).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 quese pretende que sejam “fotografados” (Transformação de Modelação).

2. Compôr a cena, colocando os objectos constituintes nas posições e orientações com quese 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).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).4. Determinar as dimensões e posição da “fotografia” final (Transformação de Viewport).

ModelViewMatrix

ModelViewMatrix

ProjectionMatrix

ProjectionMatrix

PerspectiveDivision

PerspectiveDivision

ViewportTransformation

ViewportTransformation

VertexVertex

Worldcoordinates

Worldcoordinates

EyeCoordinates

EyeCoordinates

ClipCoordinates

ClipCoordinates

NormalizedDevice

Coordinates

NormalizedDevice

Coordinates

WindowCoordinates

WindowCoordinates

Page 43: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

A Definição de TransformaçõesA Definição de Transformações

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

3) Sempre que é aplicada uma nova matriz de transformação M, essa matriz é multiplicada pelamatriz corrente C (glMultMatrix (matrix*)), à sua direita: CM. Deste modelo resulta queas transformações são aplicadas aos objectos pela ordem inversa daquela por que são definidas.

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) eGL_PROJECTION (Projecção).

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

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

Page 44: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Transformações de Model. e Vis. BásicasTransformações de Model. e Vis. Básicas

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

Quando se pretende aplicar transformações básicas,o openGL fornece funções utilitárias que, face aglMultMatrix, têm a vantagem de calcular as matrizesa partir dos parâmetros de transformação:

glTranslate (x, y, z);glRotate (angle, x, y, z);glScale (x, y, z);

R T

R

T

Objecto:1º Translação2º Rotação

Referencial:1º Rotação2º Translacção

x

y

zx

y

z

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

Page 45: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Definir a Transformação de VisualizaçãoDefinir a Transformação de 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 doespaço da cena) pode ser feita por invocação das funções glTranslate e glRotate. Os parâmetrosindicam movimentos dos objectos face a uma câmara estática e os seus valores simétricospodem ser encarados como movimentos da câmara face aos objectos.

2) Através da Função gluLookAt ():up

vector

eye

X

Y

Z

center

gluLookAt ( eyex, eyey, eyez,centerx, centery, centerz,upx, upy, upz );

Page 46: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Transformação de ProjecçãoTransformação de 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 paraalterar 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 ()

Nota: Com esta função é possível definirum Volume de Visualização assimétrico

void glFrustum ( left, right,bottom, top,near, far );

left

right

top

bottom

near

far

Page 47: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Transformação de Projecção (cont.)Transformação de Projecção (cont.)2) PERSPECTIVA: Vol. de Visualiz. especificado por gluPerspective ()

void gluPerspective ( fovy, aspect,near, far );

nearfar

w

h

fovyfovy: abertura da câmara,medida por um ângulono plano xoz

aspect = w / h

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

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

viewpoint

near far

right

lefttop

bottom

Page 48: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Demonstração projectionDemonstração projectionUsar 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.

Page 49: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Transformação de ViewportTransformação de 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 sersubmetidos à 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.

Notas : Se a relação de aspecto do Viewport não fôr a mesmada janela de projecção, a imagem projectada pode sofrerdistorção.

A aplicação deve detectar eventos de redimensionamentoda janela gráfica e modificar o viewport de acordo com essa alteração

void glViewport (GLint x, GLint y,GLsizei width, GLsizei height);

Page 50: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Mapeamento janela-viewportMapeamento janela-viewport

Calcular a transformação que mapeia a janela de visualização limitada por Xwmin, Xwmax, Ywmin e Ywmaxnum viewport de limites Xvmin, Xvmax, Yvmin e Yvmax.

(consulte secção 5.4 do livro Computer Graphics do Foley, Van Dam)

Page 51: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Desenhando formas geométricasDesenhando formas 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 colorglColor3f(1.0f, 0.0f, 0.0f); // Set current drawing color to redglRectf(100.0f, 150.0f, 150.0f, 100.0f); // Draw a filled rectangle with current colorglFlush(); // Flush drawing commands

}void Setup(void) // Setup the rendering state{

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

Page 52: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Desenhando formas geométricas (cont.)Desenhando formas geométricas (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 dimensionsglMatrixMode(GL_PROJECTION); // Reset coordinate systemglLoadIdentity();

// 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();

}

Page 53: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Desenhando formas geométricas (cont.)Desenhando formas geométricas (cont.)

• void glutReshapeFunc (void (*func)(int width, int height));Especifica a função a invocar quando a janela é criada, redimensionada ou transladada. (essafunção invoca glViewport para redefinir a área de ecrã e redefine a matriz deprojecção). Necessário garantir relações de aspecto iguais entre o viewport e a janelade visualização (definida pelo volume de visualização)

• OpenGL possui dois tipos de Matrizes de Transformação: Projecção (afecta asdimensõ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 futurastransformações

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

Page 54: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Stacks de MatrizesStacks de Matrizes

void glPushMatrix (void);

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

void glPopMatrix (void);

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 stackcom uma só matriz.

PUSH

POP

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 ostack Projection apenas 2 níveis (geralmente não se efectua composição de projecções).

Page 55: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Utilização do Stack Utilização do Stack

//alteração ao código que desenhava um rectângulo para// que este seja escaladovoid 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=1glScalef(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();

}

Page 56: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Animação:um exemploAnimação:um exemplo

• Um simples programa de animação em que um rectângulo se movimenta no ecrã.

• Ver o código em: Bounce_c.htm

Page 57: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

3-Interacção3-Interacção

(Cap. B2, pag. 41-44, B4, pag. 188-195, B10, pag. 435-442, A7, pág. 255-270,

A13, pag. 531-552)

Page 58: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

InteracçãoInteracçã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

Page 59: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Dispositivos de entradaDispositivos de 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

Page 60: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Dispositivos físicos de entradaDispositivos físicos de 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.

Page 61: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Dispositivos lógicos de entradaDispositivos lógicos de 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

Page 62: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Classes de dispositivos lógicos de entradaClasses de dispositivos lógicos de 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

Page 63: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Medição e TriggerMedição e 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.

Page 64: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Modos de EntradaModos de 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

Page 65: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Modos de Entrada (cont.)Modos de Entrada (cont.)

Page 66: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Modos de Entrada (cont.)Modos de Entrada (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

Page 67: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Gestão de Eventos em OpenGLGestão de Eventos em 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çãoinvoca 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 glutDisplayFunclogo 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.

Page 68: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Gestão de Eventos em OpenGL (cont.)Gestão de Eventos em OpenGL (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ódigonã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 oulibertado. 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 dajanela, ao mesmo tempo que estão premidos um ou mais botões do mesmo. X e Y indicama posição do cursor quando o evento ocorre.

Page 69: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Programa Interactivo: ExemploPrograma Interactivo: 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 vezque 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 ocorrezoom-in e zoom-out, respectivamente.

Ver o código em Interaction.c

Page 70: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Listas de DesenhoListas de 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.

Page 71: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

OpenGL em Modo de Retenção: Display Lists OpenGL em Modo de Retenção: Display Lists

• Num mesmo programa é possível intercalar comandos openGL a executar em modoimediato e comandos em modo de retenção, encapsulados em objectos gráficos: asdisplay lists.

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

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

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

Page 72: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Criação e Execução de Display ListsCriação e Execução de Display 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 sejamexecutados enquanto são registados na display list

GL_COMPILE_AND_EXECUTE: quanto se pretende que os comandosOpenGL sejam imediatamente executadosao 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 ordempor que foram registados, tal como se fossem invocados em modo imediato.

Page 73: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Display Lists: alguns aspectos relevantesDisplay Lists: alguns aspectos relevantes

1. Optimizações do Desempenho

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

• Por questões de desempenho, uma display-list é uma cache de comandos e não um objectonuma 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 processoOpenGL 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.

• Num ambiente distribuido, em que a aplicação se encontra numa máquina cliente e o processoOpenGL 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 oscomandos podem ser pré-processados e armazenados da forma mais compatível possível comas características do hardware gráfico de base (ex: cálculo dos coeficientes das matrizes detransformação a partir dos parâmetros de transformação).

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

• Em certas implementações de OpenGL mais sofisticadas, pode mesmo proceder-se à fusãode comandos adjacentes, como a concatenação de matrizes de transformação.

• Em certas implementações de OpenGL mais sofisticadas, pode mesmo proceder-se à fusãode comandos adjacentes, como a concatenação de matrizes de transformação.

Page 74: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Display Lists: alguns aspectos relevantes (cont.)Display Lists: alguns aspectos relevantes (cont.)2. O que se regista numa Display List

e como afecta o estado do sistema

3. Display Lists Hierárquicas

• Os valores registados para os argumentos dos comandos de uma display-list, são os quevigoravam na altura em que a display-list estava a ser compilada. Mesmo que se trate de umavariável à qual se atribui posteriormente um outro valor, a display-list não é alterada.

• Os valores registados para os argumentos dos comandos de uma display-list, são os quevigoravam na altura em que a display-list estava a ser compilada. Mesmo que se trate de umavariável à qual se atribui posteriormente um outro valor, a display-list não é alterada.

• Nem todos os comandos OpenGL podem ser registados numa display-list. Comandos queinvolvam parâmetros por referência ou devolvam um valor, não são registados dado que alista 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.

• Nem todos os comandos OpenGL podem ser registados numa display-list. Comandos queinvolvam parâmetros por referência ou devolvam um valor, não são registados dado que alista 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.

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

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

• 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 essemesmo estado após a sua execução, há que efectuar operações explícitas de push e pop dematrizes e atributos (glPushMatrix, glPushAttrib, glPopMatrix, glPopAttrib)

• 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 essemesmo estado após a sua execução, há que efectuar operações explícitas de push e pop dematrizes e atributos (glPushMatrix, glPushAttrib, glPopMatrix, glPopAttrib)

Page 75: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Display Lists: exemploDisplay Lists: 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);

Page 76: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Gestão de Listas e seus ÍndicesGestão de Listas e seus Índices

A utilização directa e indiscriminada de índices para as listas a criar pode provocar efeitosindesejados, como o apagamento de uma lista, por utilização indevida do seu índice.A utilização directa e indiscriminada de índices para as listas a criar pode provocar efeitosindesejados, 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 tenhamsido entretanto apagados.

GLboolean glIsList (Gluint list);

Retorna TRUE se o valor list corresponder a um índice correntemente utilizado e FALSEcaso contrário.

Void glDeleteLists (GLuint list, Glsizei range);

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

Page 77: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Selecção de ObjectosSelecção de Objectos

• Em aplicações interactivas é fundamental que o sistema gráfico de base forneça umqualquer mecanismo de selecção de objectos ou partes de objectos presentes numa cena.

• Em aplicações interactivas é fundamental que o sistema gráfico de base forneça umqualquer 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 objectosque são desenhados sobre uma determinada região da janela corrente.

• O OpenGL fornece um mecanismo de selecção que automaticamente identifica os objectosque 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 objectoou objectos seleccionados pelo utilizador através de um cursor gráfico (“picking”).

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

ObjectosObjectos

Janelade PickJanelade Pick

CursorCursor

Page 78: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

• Para utilizar o mecanismo de selecção do OpenGL começa-se por desenhar a cena noframe-buffer, comutar em seguida para o modo de operação “Selection” e invocar de novoos 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 invocadasoperações de desenho

• Quando se abandona o modo “Selection”, o sistema devolve um registo de todas as primitivasque 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 umconjunto de nomes (valores inteiros) identificadores da primitiva e outros dados com elarelacionados -“hit record”. Os vários “hit records” são armazenados num mesmo array.

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

O Modo de Operação “Selection”O Modo de Operação “Selection”

Page 79: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

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 armazenadosbuffer: 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 devolvidopela função indica o número de “selection hits” que foram registados.

Passos para a activação do Modo de SelecçãoPassos para a activação do Modo de Selecção

Page 80: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

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 hajapelo 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 efeitosde selecção

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

Passos para a activação do Modo de Selecção (cont.)Passos para a activação do Modo de Selecção (cont.)

Page 81: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Passos para a activação do Modo de Selecção (cont.)Passos para a activação do Modo de Selecção (cont.)

5) Alternar comandos de desenho de primitivas com comandos de manipulação dostack de nomes.

/* Com um só nível hierárquico */glInitNames ( );glPushName (-1); ……glLoadName (1);drawOneObject ();glLoadName (2);drawAnotherObject ();glLoadName (3);drawYetAnotherObject ();

Os comandos glPushName, glPopName eglLoadName são ignorados se não seestiver em modo de selecção. O mesmocódigo de desenho pode ser usado para“Rendering” ou “Selection”

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.

Page 82: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Operação de Pick com base no Mecanismo de SelecçãoOperação de Pick com base no Mecanismo de Selecção

Utilizar uma Matriz de Picking, em conjugação com a matriz de projecção para restringir aselecção de primitivas a uma pequena região do viewport, tipicamente centrada na posiçãoindicada 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 umdispositivo 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

Page 83: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Transformações InversasTransformações 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.

Page 84: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

4-Cor e Iluminação4-Cor e Iluminação

(Cap. A4 e A5)

Page 85: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Definição de CorDefinição de 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).

Page 86: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Propriedades MateriaisPropriedades 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).

Page 87: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Modelos de SombreamentoModelos de Sombreamento

• Podem ser definidos os Modelos de Sombreamento – Constante – Gouraud (por omissão)

Page 88: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Cálculos de IluminaçãoCálculos de Iluminação

• Descreve-se a luz proveniente das fontes e a iluminação da superfície dos objectos com basenum modelo cromático RGB.

• A côr de uma fonte de luz é definida pela percentagem (0 a 1) de luz vermelha, verde e azulque emite.

• Os materiais constituintes das superfícies a iluminar são caracterizados pela percentagem deluz 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 fontespode 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, provenientedas fontes, sobre os objectos da cena (luz ambiente).

• Pode definir-se uma componente de luz ambiente global, para a qual não é possível identificarsequer a fonte de origem.

• A iluminação de um objecto resulta da soma de 4 componentes distintas: luz emitida, luzambiente, luz difundida e luz reflectida ou especular.

Page 89: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

As Várias Componentes de LuzAs Várias Componentes de Luz

Luz Emitida:

Luz Especular:

Luz Ambiente:

Luz Difundida:

Luz emitida pela própria superfície do objecto, não afectadapor qualquer fonte de luz.

Luz proveniente de todas as direcções (devido a múltiplasreflexões na cena) e reflectida pela superfície em todas asdirecções.

Luz proveniente de uma direcção bem definida e reflectidaigualmente segundo todas as direcções. A quantidade de luzreflectida 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 proveniente de uma direcção bem definida e que tende areflectir-se em torno de uma direcção preferencial. O brilho dasuperfície depende da direcção de observação.

Page 90: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Conjugação das Propriedades das Fontes e dos MateriaisConjugação das Propriedades das Fontes e dos Materiais

• As Fontes de Luz• As Fontes de LuzEmbora uma fonte real emita luz numa só distribuição de frequências, o OpenGL consideravalores de R G B diferentes para as componentes ambiente, difusa e especular (valores LR,LG, LB no intervalo [0, 1] ).

Embora uma fonte real emita luz numa só distribuição de frequências, o OpenGL consideravalores de R G B diferentes para as componentes ambiente, difusa e especular (valores LR,LG, LB no intervalo [0, 1] ).

• Os Materiais• Os MateriaisPara os materiais definem-se valores de R, G, B (MR, MG, MB no intervalo [0,1]), um conjuntopara cada uma das componentes de luz reflectida: ambiente, difusa e especular.Para os materiais definem-se valores de R, G, B (MR, MG, MB no intervalo [0,1]), um conjuntopara cada uma das componentes de luz reflectida: ambiente, difusa e especular.

• A Luz Reflectida por Componente• A Luz Reflectida por ComponenteA luz reflectida por um objecto, em cada uma das diferentes componentes, é dada pelo produtoentre os correspondentes valores de R, G, B da fonte de luz e do material:A luz reflectida por um objecto, em cada uma das diferentes componentes, é dada pelo produtoentre os correspondentes valores de R, G, B da fonte de luz e do material:

(LR * MR, LG * MG, LB * MB)(LR * MR, LG * MG, LB * MB)• A Iluminação Total• A Iluminação TotalA iluminação de um objecto, ou seja, a totalidade da luz que nele se reflecte e atinge a vista doobservador obtém-se somando entre si os valores R G B de cada componente de reflexão.A iluminação de um objecto, ou seja, a totalidade da luz que nele se reflecte e atinge a vista doobservador 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 )(R1+R2 + … + Rn, G1 + G2 + … + Gn, B1 + B2 + … + Bn )

O resultado de cada soma é truncado ao valor 1, correspondente ao máximo de intensidade.O resultado de cada soma é truncado ao valor 1, correspondente ao máximo de intensidade.

Page 91: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Representação de uma Cena com IluminaçãoRepresentação de uma Cena com Iluminação

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

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

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

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

3) Definir os parâmetros do modelo de iluminação (características, como onível de luz ambiente global e a localização efectiva do ponto de observação).

3) Definir os parâmetros do modelo de iluminação (características, como oní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 respectivosmateriais.

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

Page 92: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Criação e Activação de Fontes de LuzCriação e Activação de Fontes de Luz

1) Sucessivas invocações da função glLight*() permitem estabelecer diferentes característicaspara uma dada fonte de luz

1) Sucessivas invocações da função glLight*() permitem estabelecer diferentes característicaspara 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 definirparam: valor a atribuir à característica seleccionada

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 definirparam: valor a atribuir à característica seleccionada

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

glEnable (GL_LIGHTING);glEnable (GL_LIGHTING);

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

glEnable (lightIndex);glEnable (lightIndex);

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

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

glEnable (GL_DEPTH_TEST);glEnable (GL_DEPTH_TEST);

Page 93: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Propriedades de uma Fonte de LuzPropriedades de uma Fonte de Luz

• GL_AMBIENT: valores RGBA para a intensidade da luz ambiente• GL_AMBIENT: valores RGBA para a intensidade da luz ambiente• GL_DIFFUSE: valores RGBA para a intensidade da luz difusa• GL_DIFFUSE: valores RGBA para a intensidade da luz difusa• GL_SPECULAR: valores RGBA para a intensidade da luz especular• 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 edirecção dada por (x, y, z)se w = 1, fonte de luz posicional, com posição dadapor (x, y, z) em coord. de objecto. Raios divergentes.

• GL_POSITION: (x, y, z, w) se w = 0, fonte de luz direccional: posição infinita edirecção dada por (x, y, z)se w = 1, fonte de luz posicional, com posição dadapor (x, y, z) em coord. de objecto. Raios divergentes.

• GL_SPOT_DIRECTION:• GL_SPOT_DIRECTION:• GL_SPOT_EXPONENT:• GL_SPOT_EXPONENT:• GL_SPOT_CUTOFF:• GL_SPOT_CUTOFF:

• GL_CONSTANT_ATTENUATION (Kc):• GL_CONSTANT_ATTENUATION (Kc):• GL_LINEAR_ATTENUATION (Kl):• GL_LINEAR_ATTENUATION (Kl):• GL_QUADRATIC_ATTENUATION (Kq):• GL_QUADRATIC_ATTENUATION (Kq):

directiondirection

cutoffcutoff

cos (θ)cos (θ)exponentexponent

attenuation factor = attenuation factor = 11Kc + Kl.d + Kq.d2Kc + Kl.d + Kq.d2

d: distância da fonte ao vérticed: distância da fonte ao vértice

Page 94: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Fontes de Luz e TransformaçõesFontes de Luz e 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.

• 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ãotransformados por aplicação da Transformação ModelView corrente e guardados emcoordenadas de vista (eye coordinates).

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

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

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

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

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

Page 95: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Modelo de IluminaçãoModelo de 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).

Page 96: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Parametrização do Modelo de IluminaçãoParametrização do Modelo de Iluminação

• Luz Ambiente Global• Luz Ambiente Global

• Ponto de Observação Infinito ou Local• Ponto de Observação Infinito ou Local

• Iluminação por Tipo de Faceta• Iluminação por Tipo de Faceta

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

Valores de RGBA para a intensidade da luz ambiente que não é possível relacionar com umadada fonte de luz. Graças a esta componente luminosa, é possível visualizar os objectospresentes 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);Glfloat ambient_light [ ] = { 0.2, 0.2, 0.2, 1.0}glLightModelfv (GL_LIGHT_MODEL_AMBIENT, ambient_light);

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

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

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

glLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUEglLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE

glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, GL_TRUEglLightModeli (GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE

Page 97: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Definição das Propriedades dos MateriaisDefinição das Propriedades dos Materiais

Sucessivas invocações da função glMaterial*() permitem estabelecer as diferentes característicasópticas do material corrente.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 definirparam: valor a atribuir à característica seleccionada

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 definirparam: valor a atribuir à característica seleccionada

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

• GL_SPECULAR: percentagens RGBA para a luz especular reflectida• GL_SPECULAR: percentagens RGBA para a luz especular reflectida

• GL_EMISSION: valores RGBA para a intensidade da luz emitida pelopróprio material (Não influencia a iluminação de outrosobjectos, ou seja, não actua como fonte de luz)

• GL_EMISSION: valores RGBA para a intensidade da luz emitida pelopróprio material (Não influencia a iluminação de outrosobjectos, ou seja, não actua como fonte de luz)

• GL_SHININESS: grau de especularidade do material (0 a 128). Quantomaior o valor, mais pequena e brilhante a zona especular

• GL_SHININESS: grau de especularidade do material (0 a 128). Quantomaior o valor, mais pequena e brilhante a zona especular

Page 98: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Método Alternativo de Definição de PropriedadesMétodo Alternativo de Definição de Propriedades

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

• Invocações à função glColorMaterial permitem definir, para determinados tipos de faces, quaisas propriedades ópticas de um material que herdam automaticamente os valores da côr dedesenho 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

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:• Para que o efeito de glColorMaterial se faça sentir, é necessário activar uma variável de estado:

glEnable (GL_COLOR_MATERIAL);glEnable (GL_COLOR_MATERIAL);

Page 99: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

A Matemática dos Cálculos de IluminaçãoA Matemática dos Cálculos de Iluminação

Em modo cromático RGBA, os cálculos necessários à determinação da côr a atribuir aum dado vértice são:Em modo cromático RGBA, os cálculos necessários à determinação da côr a atribuir aum 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

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érticel: versor que aponta do vértice para a fonte de luzs: versor na direcção da soma entre l e o vector que une o vértice ao ponto de observação

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

Page 100: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Demonstração light & materialDemonstração light & materialUsar 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).

Page 101: Introdu..o ao OpenGL - Técnico Lisboa - Autenticação · • Polígonos Planares (para que a sua projecção seja sempre convexa, independentemente do ponto de observação)

©JAP & Instituto Superior Técnico

Demonstração textureDemonstração textureUsar a aplicação texture para mostrar:• Várias texturas;• Aplicação de texturas a objectos 3D;• Desempenho necessário;• Transformações 3D.