1-Introdução ao OpenGL

Documentos relacionados
CG 2013/2014 Primeiro Teste LEIC Alameda/Taguspark

Computação Gráfica - OpenGl 02

INTRODUÇÃO A OPENGL. Computação Gráfica

Computação Gráfica - 04

OpenGL, GLU e GLUT. GLUT (OpenGL Utility Toolkit) OpenGL. Linguagem. OpenGL. Esqueleto de um programa em PyOpenGL

Introdução à Programação em OpenGL. Prof. Márcio Bueno

n À primeira vista: basta desenhar n Uma subrotina para desenhar cada tipo de objeto n Mas... n Como fazer interação? n Como estruturar a cena?

Cap. 4: Janelas, Visores & Recorte Gráfico

OpenGL. Sumário COMPUTAÇÃO GRÁFICA E INTERFACES. Introdução. Introdução. Carlos Carreto

OpenGL. Alberto B. Raposo

LAB. 1. Introdução à OpenGL

PROGRAMAÇÃO OPENGL LIVRO: TEORIA DA COMPUTAÇÃO GRÁFICA

Visualização. - Aula 4 -

OpenGL. Parte I: Geometria. Waldemar Celes Departamento de Informática Tecgraf/PUC-Rio

Paulo Sérgio Rodrigues. Exercícios de Laboratório

Introdução Programando com OpenGL Exemplos. O que é OpenGL? [1]

Introdução a Prática em OpenGL

Computação Gráfica. 5385: Licenciatura em Engenharia Informática. Cap. 3 Janelas e Visores. Janelas e Visores

OpenGL Um tutorial. Luis Valente. Instituto de Computação - Universidade Federal Fluminense lvalente@ic.uff.br. Dezembro, 2004

Primitivas do OpenGL. Tomás Antônio C. Badan

Conceitos importantes da Computação Gráfica [3]

OpenGL. Soraia Musse

Iluminação em OpenGL. André Tavares da Silva.

Introdução a OpenGL. Profª. Alessandra Martins Coelho

Visualização 2D: - Transformação window to viewport - Clipping

UNIVERSIDADE FEDERAL FLUMINENSE Pedro Martins Menezes. Um estudo dos estágios dos pipelines gráficos

Capítulo 3 Primeiros Passos em OpenGL Função Desenha Função Teclado Função Inicializa Programa Principal...

Pipeline de Visualização 3D

OpenGL. Introdução ao OpenGL. OpenGL. OpenGL. OpenGL. OpenGL. Profa. M. Cristina Profa. Rosane

Projeções e Transformações em 3D

António Costa. Paulo Roma Cavalcanti

Transformações (Cap 4.3, 4.4 e 4.6 a 4.10)

Reflexões e Sombras em Superfícies Planares Animação e Visualização Tridimensional Prof. João Madeiras Pereira Instituto Superior Técnico 2005/2006

Projeções e Visualização

Fundamentos de Computação Gráfica

Computação Gráfica. Licenciatura em Engenharia Informática e de Computadores Alameda / Taguspark. Exame de Recurso 29 de Junho de 2011

Programação Gráfica 2D com OpenGL (Aulas 22, 24 e 25)

Computação Gráfica - 13

Algoritmos de Recorte em 2D

Introdução à Computação Gráfica. Claudio Esperança Paulo Roma Cavalcanti

Introdução Geral a Computação Gráfica. Universidade Católica de Pelotas Curso de Engenharia da Computação Disciplina de Computação Gráfica

Transformações de Visualização 2D: Clipping. Antonio L. Bajuelos Departamento de Matemática Universidade de Aveiro

OpenGL. O que é OpenGL. O Pipeline do OpenGL. Listas de Exposição

FCG2006 Prova sobre OpenGL e Rastreamento de Raios

Computação Gráfica - 13

Fundamentos de Programação. Linguagem C++ aula II - Variáveis e constantes. Prof.: Bruno Gomes

CRAb Grupo de Computação Gráfica Departamento de Computação UFC

O AMBIENTE DE TRABALHO... 2 CRIAR, ABRIR E GUARDAR DOCUMENTOS... 6 EDIÇÃO DE DOCUMENTOS... 7 FORMATAÇÃO DE TEXTO Manual de Word INTRODUÇÃO...

Computação Gráfica - 13

Pedro Vasconcelos DCC/FCUP. Programação Funcional 11 a Aula Gráficos usando Gloss

Prof. Fernando V. Paulovich 3 de maio de SCC Computação Gráca

Computação Gráfica - 09

Animação e Visualização Tridimensional

Tomás Antônio Costa Badan. Mapa de Textura: O Básico

Computação Gráfica OpenGl 03

Engenharia Informática Computação Gráfica

Iluminação e Sombreamento

Programa de Aprimoramento Discente em Modelagem Geométrica Computacional. Curso Básico de OpenGL

Linguagem C Princípios Básicos (parte 1)

OpenGL Conceitos Básicos

Modelação de Sólidos. Sistemas Gráficos/ Computação Gráfica e Interfaces FACULDADE DE ENGENHARIA DA UNIVERSIDADE DO PORTO

Ferramentas do Flash CS3

2º Exame de Computação Gráfica

Pipeline de Visualização Câmara Virtual

Manual de Apoio Luís Filipe Lobo

Ficheiros de texto 1. Ficheiros de texto. 1. Implementar um programa que leia uma frase do teclado e a escreva num ficheiro.

Engenharia Informática Computação Gráfica

Exame Tipo Computação Gráfica

Iluminação (lighting) e Sombreamento (shading)

Programação: Vetores

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Computação Gráfica - 12

Cenários 3D Interativos com Software Livre

Visibilidade. Apontamentos CG + Edward Angel, Sec Instituto Superior Técnico Computação Gráfica 2009/2010

7. Projeções Geométricas e Visualização 3D

TÉCNICO DE INFORMÁTICA - SISTEMAS

Como Fazer um Programa, simples, em OpenGL para Trabalhar com Iluminação (exemplo do site da Isabel Mansour)

Existem três formas básicas de efectuar operações de entrada/saída:

EXAME NACIONAL DO ENSINO SECUNDÁRIO

8. Síntese de Imagens: Cálculo de Cor

TÉCNICAS DE CAD PARA ENGENHARIA CIVIL AULA 7 2. INCLUSÃO DE PADRÕES DE HACHURAS NOS DESENHOS

Desenvolvimento de aplicações tridimensionais com OpenGL

Disciplina de Algoritmos e Programação

Capítulo. Introdução. Leia isto primeiro! Neste manual, estes símbolos indicam os seguintes avisos. : Notas importantes. : Notas

Transcrição:

1-Introdução ao OpenGL Prof. João Madeiras Pereira

Bibliografia A) OpenGL Programming Guide (4ª Edição) B) Computer Graphics Principles and Practice (Foley, Van Dam)

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

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

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

O 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

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

Pipeline OpenGL Simples Versão simplificada do pipeline OpenGL

Pipeline OpenGL Vertex Data Display List Evaluators Per-Vertex Operations and Primitive Assembly Rasterization Per-Fragment Operations Frame buffer Pixel Data Pixel Operations Texture Assembly

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

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

Avaliadores Convertem representações paramétricas de objectos com Texturas e Cor (a partir das coordenadas dos pontos de controlo) na geometria de uma malha de polígonos planares (facetas) e calculam ainda: Normais Coordenadas de texturas Cor

Operaçõ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);

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

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

Assemblar Texturas Várias texturas, descritas através de pixelmaps podem ser aplicadas a objectos geométricos 3D. Para isso define um bloco de memória onde são armazenadas as diferentes imagens de texturas para posterior selecção e mapeamento.

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

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

Tipos de Dados OpenGL Portabilidade facilitada com a definição de tipos de dados OpenGL Tipo de dado OpenGL Representação interna Tipo de dado C equivalente GLbyte 8-bit integer signed char b GLshort 16-bit integer short s GLint, GLsizei 32-bit integer int ou long i GLfloat, GLclampf 32-bit floating-point float f GLdouble, GLclampd 64-bit floating-point double d GLubyte, GLboolean GLushort GLuint, GLenum, GLbitfield 8-bit unsigned integer 16-bit unsigned integer 32-bit unsigned integer unsigned char unsigned short unsigned long ou unsigned int Sufixo ub us ui

Convenção p/ comandos OpenGL <PrefixoBiblioteca> <ComandoRaiz> <NúmeroArgumentosOpcional> <TipoArgumentosOpcional> Exemplos: glcolor3f glcolor3i glcolor3d

Bibliotecas Toolkit de Alto Nível (Fahrenheit Scene Graph) Utility Library OpenGL Utility Toolkit Sistema de Gestão de Janelas glu gl glut glx, wgl,agl

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

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

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.

Máquina de 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) :

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

#include <windows.h> #include <GL/glut.h> Primeiro Programa void RenderScene(void) // Called to draw scene { glclear(gl_color_buffer_bit); // Clear the window with current clearing color glflush(); // Flush drawing commands } void Setup(void) // Setup the rendering state { glclearcolor(0.0f, 0.0f, 1.0f, 1.0f); } // Main program entry point void main(void) { glutinitdisplaymode(glut_single GLUT_RGB); glutcreatewindow("simple"); glutdisplayfunc(renderscene); Setup(); glutmainloop(); }

Funçõ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 seu identificador void glutdisplayfunc (void (*func)(void)); Especifica a função a invocar sempre que o conteúdo de uma janela tem de ser redesenhado (abertura, pop-up, objectos sobrepostos ) void glutmainloop (void); Função para activação do ciclo infinito de processamento de eventos.

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)

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 ( ); Desenhando uma Primitiva glbegin e glend marcam o início e fim de uma lista de vértices que descreve a geometria de uma primitiva com o tipo seleccionado em glbegin. Para além da função glvertex, que permite definir a geometria de cada vértice, existem outras funções que, de uma forma modal, atribuem diversas características aos vértices: glcolor (), glindex () glnormal () gltextcoord () glmaterial () definem a côr define o vector normal ao vértice define uma coordenada de textura define propriedades ópticas do material

Tipos de Primitivas 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)

v3 v0 v2 v1 GL_POINTS v4 v0 v6 Primitivas Gráficas Simples v4 v1 v2 GL_LINES v7 v5 v3 v0 v3 v2 v4 v1 GL_LINE_STRIP v4 v3 v2 v0 v1 GL_LINE_LOOP v1 v4 v5 v0 v2 v4 v1 v2 v3 v0 v2 v3 GL_TRIANGLES v1 v3 v5 GL_TRIANGLE_STRIP v0 v4 GL_TRIANGLE_FAN v1 v2 v5 v6 v1 v3 v5 v7 v4 v0 v1 v0 v3 v4 GL_QUADS v7 v0 v2 v4 GL_QUAD_STRIP v6 v3 v2 GL_POLYGON

Restrições à Definição de 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 do ponto de observação) Polígonos mais complexos ou irregulares podem ser gerados por união de polígonos simples (Tesselation) Polígonos Válidos Polígonos Inválidos

Gestão de 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 afectam a síntese da cena de uma forma mais abrangente (iluminação, textura, remoção de superfícies, nevoeiro, ), são armazenados em variáveis de estado. Existem funções para activar (ON), desactivar (OFF) e interrogar variáveis de estado booleanas: (GL_DEPTH_TEST, GL_FOG, GL_LIGHTING, ) void glenable (GLenum capability); void gldisable (Glenum capability); void glisenabled (Glenum capability); Um outro conjunto de funções permite obter o valor corrente de variáveis de estado mais complexas (GL_CURRENT_COLOR, GL_CURRENT_NORMAL, etc..) void glgetbooleanv (GLenum pname, Glboolean *params); void glgetintegerv (GLenum pname, GLint *params); void glgetfloatv (GLenum pname, GLfloat *params); void glgetdoublev (GLenum pname, GLdouble *params); void glgetpointerv (GLenum pname, GLvoid **params);

Alguns Atributos Gráficos glpointsize: gllinewidth: gllinestipple: glpolygonmode: glfrontface: glcullface: glpolygonstipple: Tamanho de um ponto em pixels Espessura de linha em pixels Padrão para linhas Modo de desenho do polígono (point, line, fill) Sentido de Circulação para Front-Faces e Back-Faces Escolha de qual o tipo de faces a remover antes da rasterização Padrão de preenchimento de polígonos

Vértices A cada vértice pode associar-se: Cor definida por valor ou como índice de uma tabela de cores Vector normal Coordenada de uma textura Propriedade do material Indicação precede uma aresta de fronteira E podem ser definidos através de Arrays.

Transformaçõ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 existe um gestor de stack de matrizes. Podem ser usados 6 planos adicionais de recorte.

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

Rasterizaçã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 antialiasing. Padrão de preenchimento de linha e respectivo factor multiplicativo.

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

Demonstração shapes Usar a aplicação shapes para mostrar: Tipos de Objectos Geométricos (glbegin); O estado Cor (usar o polígono); Geometria da malha de triângulos (alterar 2ª e 3ª cor do Triangle_Strip); Polígonos não planares; Atributos (fronteira do polígono).

Transformações Geométricas no no Pipeline Numa perspectiva de Câmara Virtual, a definição das transformações necessárias ao posicionamento da câmara (visualização) e disposição dos objectos na cena (modelação) faz-se, geralmente, na seguinte sequência: 1. Posicionar e orientar a câmara dentro do espaço da cena (Transformação de Visualização). 2. Compôr a cena, colocando os objectos constituintes nas posições e orientações com que se pretende que sejam fotografados (Transformação de Modelação). 3. Escolher uma lente para a câmara ou ajustar o Zoom (Transformação de Projecção). 4. Determinar as dimensões e posição da fotografia final (Transformação de Viewport). Vertex ModelView Matrix Matrix Projection Matrix Matrix Perspective Division Viewport Transformation World coordinates Eye Coordinates Clip Coordinates Normalized Device Coordinates Window Coordinates

A Definição de de Transformações 1) As matrizes de Modelação e de Visualização ficam concatenadas numa única matriz, designada MODELVIEW. 2) Existe uma função para seleccionar a matriz sobre a qual se pretende efectuar uma alteração. glmatrixmode ( ) permite comutar entre GL_MODELVIEW (Modelação-Visualização) e GL_PROJECTION (Projecção). 3) Sempre que é aplicada uma nova matriz de transformação M, essa matriz é multiplicada pela matriz corrente C (glmultmatrix (matrix*)), à sua direita: CM. Deste modelo resulta que as transformações são aplicadas aos objectos pela ordem inversa daquela por que são definidas. 4) Dada a dependência entre visualização e modelação, o programador deve começar por definir a transformação de visualização e só depois as transformações de modelação, para que a primeira possa afectar os objectos depois de devidamente posicionados e orientados na cena. 5) Dado que nem sempre se pretende um efeito acumulativo, existem funções para estabelecer um dado valor para a matriz corrente (glloadmatrix (matriz*)) ou inicializá-la com a matriz identidade (glloadidentity ()).

Transformações de de Model. e Vis. Básicas Quando se pretende aplicar transformações básicas, o opengl fornece funções utilitárias que, face a glmultmatrix, têm a vantagem de calcular as matrizes a partir dos parâmetros de transformação: gltranslate (x, y, z); glrotate (angle, x, y, z); glscale (x, y, z); Transformação de Objectos versus Transformação de Referencial y Objecto: 1º Translação 2º Rotação R y T Referencial: 1º Rotação 2º Translacção z R T x z x 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.

Definir a Transformação de 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 do espaço da cena) pode ser feita por invocação das funções gltranslate e glrotate. Os parâmetros indicam movimentos dos objectos face a uma câmara estática e os seus valores simétricos podem ser encarados como movimentos da câmara face aos objectos. up 2) Através da Função glulookat (): Y vector glulookat ( eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz ); eye center X Z

Transformação de 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 para alterar a posição e orientação do volume de visualização é possível mas não recomendada (controlo pouco intuitivo). 1) PERSPECTIVA: Volume de Visualização Especificado por glfrustum () void glfrustum ( left, right, bottom, top, near, far ); near far left top Nota: Com esta função é possível definir um Volume de Visualização assimétrico bottom right

Transformação de de Projecção (cont.) 2) PERSPECTIVA: Vol. de Visualiz. especificado por gluperspective () void gluperspective ( fovy, aspect, near, far ); fovy: abertura da câmara, medida por um ângulo no plano xoz aspect = w / h near fovy w far h 3) PARALELA (Ortogonal): Vol. de Visualização especificado por glortho () void glortho ( left, right, bottom, top, near, far ); viewpoint left top right bottom near far

Demonstração projection Usar a aplicação projection para mostrar: Vários tipos de projecção; Utilização de função do glulookat; Planos de Recorte; Abertura da câmara.

Transformação de 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 ser submetidos à Transformação de Viewport: Define-se a porção da área do dispositivo de saída onde deve ser mapeada a projecção da cena. Essa definição é feita em coordenadas da janela activa (canto inferior esquerdo. largura e altura). Por defeito, o viewport coincide com a totalidade da janela gráfica. void glviewport (GLint x, GLint y, GLsizei width, GLsizei height); Notas : Se a relação de aspecto do Viewport não fôr a mesma da janela de projecção, a imagem projectada pode sofrer distorção. A aplicação deve detectar eventos de redimensionamento da janela gráfica e modificar o viewport de acordo com essa alteração

Mapeamento janela-viewport Calcular a transformação que mapeia a janela de visualização limitada por Xw min, Xw max, Yw min e Yw max num viewport de limites Xv min, Xv max, Yv min e Yv max. (consulte secção 5.4 do livro Computer Graphics do Foley, Van Dam)

#include <windows.h> #include <gl/glut.h> Desenhando formas geométricas void RenderScene(void) // Called to draw scene { glclear(gl_color_buffer_bit); // Clear the window with current clearing color glcolor3f(1.0f, 0.0f, 0.0f); // Set current drawing color to red glrectf(100.0f, 150.0f, 150.0f, 100.0f); // Draw a filled rectangle with current color glflush(); // Flush drawing commands } void Setup(void) // Setup the rendering state { glclearcolor(0.0f, 0.0f, 1.0f, 1.0f); }

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 dimensions glmatrixmode(gl_projection); // Reset coordinate system glloadidentity(); // Establish clipping volume (left, right, bottom, top, near, far) if (w <= h) glortho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0); else glortho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0); glmatrixmode(gl_modelview); glloadidentity(); } void main(void) // Main program entry point { glutinitdisplaymode(glut_single GLUT_RGB); glutinitwindowsize(400,350); glutinitwindowposition(10,10); glutcreatewindow("glrect"); glutdisplayfunc(renderscene); glutreshapefunc(changesize); Setup(); glutmainloop(); }

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. (essa função invoca glviewport para redefinir a área de ecrã e redefine a matriz de projecção). Necessário garantir relações de aspecto iguais entre o viewport e a janela de visualização (definida pelo volume de visualização) OpenGL possui dois tipos de Matrizes de Transformação: Projecção (afecta as dimensões do volume de visualização) e Visualização (afecta os objectos da cena) glmatrixmode define qual o tipo de matriz a ser utilizada em futuras transformações FunçãoglOrtho 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 de de Matrizes void glpushmatrix (void); PUSH Empurra todas as matrizes do stack corrente um nível para baixo e a matriz do nível superior é copiada, de modo que as duas primeiras matrizes sejam iguais. Demasiadas operações de push podem provocar a ocorrência de um erro. void glpopmatrix (void); Retira a matriz do topo do stack e destrói o seu conteúdo. Aquela que era a segunda matriz, passa a ocupar o topo do stack. Esta operação gera um erro quando executada sobre um stack com uma só matriz. glmatrixmode selecciona o stack sobre o qual se pretende efectuar uma operação. POP O stack ModelView tem tipicamente 32 níveis (importante para modelação hierárquica) e o stack Projection apenas 2 níveis (geralmente não se efectua composição de projecções).

Utilização do do Stack //alteração ao código que desenhava um rectângulo para // que este seja escalado void RenderScene(void) { glclear(gl_color_buffer_bit); glcolor3f(1.0f, 0.0f, 0.0f); //Save the current modelview matrix by pushing // the current transformation on the stack glpushmatrix( ); // Scale Ex=1.5, Ey=0.5, Ez=1 glscalef(1.5,0.5,1); glrectf(100.0f, 150.0f, 150.0f, 100.0f); } // Restore the modelview matrix by popping it // of the matrix stack glpopmatrix( ); glflush();

Animaçã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

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

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

Dispositivos 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

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

Dispositivos 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

Classes 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

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

Modos 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

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

Gestão de de Eventos em 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ção invoca glviewport para redefinir a área de recorte e redefine a matriz de projecção) void glutpostredisplay (void); Marca a janela corrente como necessitando de ser redesenhada (invocar glutdisplayfunc logo que possível) void glutkeyboardfunc (void (*func)(unsigned int key, int x, int y)); Especifica a função a invocar quando o operador prime uma tecla com um dado código ASCII. X e Y indicam a posição do rato no instante da interacção.

Gestão de de Eventos em 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ódigo não-ascii é pressionada, tais como Home, End, PgUp, PgDn, F1 e F2. Os valores válidos: GLUT_KEY_F1, GLUT_KEY_F2, GLUT_KEY_F3, GLUT_KEY_F4, GLUT_KEY_F5, GLUT_KEY_F6, GLUT_KEY_F7, GLUT_KEY_F8, GLUT_KEY_F9, GLUT_KEY_F10, GLUT_KEY_F11, GLUT_KEY_F12, GLUT_KEY_LEFT, GLUT_KEY_UP, GLUT_KEY_RIGHT, GLUT_KEY_DOWN, GLUT_KEY_PAGE_UP, GLUT_KEY_PAGE_DOWN, GLUT_KEY_HOME, GLUT_KEY_END, GLUT_KEY_INSERT. void glutmousefunc (void (*func)(int button, int state, int x, int y)); Especifica a função a invocar quando um dos botões do rato (left, middle, right) é premido ou libertado. Três valores são válidos para o parâmetro button: GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON e GLUT_RIGHT_BUTTON. O parâmetro state pode ser GLUT_UP ou GLUT_DOWN. Os parâmetros x e y indicam a localização do mouse no momento que o evento ocorreu. void glutmotionfunc (void (*func)(int x, int y)); Especifica a função a invocar quando o cursor controlado pelo rato se move dentro da janela, ao mesmo tempo que estão premidos um ou mais botões do mesmo. X e Y indicam a posição do cursor quando o evento ocorre.

Programa 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 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. Ver o código em Interaction.c

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

OpenGL em Modo de de Retenção: Display Lists Num mesmo programa é possível intercalar comandos opengl a executar em modo imediato e comandos em modo de retenção, encapsulados em objectos gráficos: as display lists. Umadisplay 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 e Execução de de Display Lists void glnewlist (GLuint list, GLenum mode); list: mode: valor inteiro positivo que identifica univocamente uma display list GL_COMPILE: quando não se pretende que os comandos OpenGL sejam executados enquanto são registados na display list GL_COMPILE_AND_EXECUTE: quanto se pretende que os comandos OpenGL sejam imediatamente executados ao mesmo tempo que são registados. void glendlist (void); Estabelece o fim de uma display list void glcalllist (GLuint list); Executa a display list identificada pelo valor de list. Os comandos são executados pela ordem por que foram registados, tal como se fossem invocados em modo imediato.

Display 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 objecto numa base de dados. Como consequência, as display-lists não são editáveis. Num ambiente distribuido, em que a aplicação se encontra numa máquina cliente e o processo OpenGL reside numa máquina-servidora, as display-lists são armazenadas no servidor, com consequente redução do tráfego da rede e aumento de desempenho. Mesmo em modo local, o mecanismo de display-list pode tornar-se mais eficiente dado que os comandos podem ser pré-processados e armazenados da forma mais compatível possível com as características do hardware gráfico de base (ex: cálculo dos coeficientes das matrizes de transformação a partir dos parâmetros de transformação). Em certas implementações de OpenGL mais sofisticadas, pode mesmo proceder-se à fusão de comandos adjacentes, como a concatenação de matrizes de transformação.

Display Lists: alguns aspectos relevantes (cont.) 2. O que se regista numa Display List e como afecta o estado do sistema Os valores registados para os argumentos dos comandos de uma display-list, são os que vigoravam na altura em que a display-list estava a ser compilada. Mesmo que se trate de uma variável à qual se atribui posteriormente um outro valor, a display-list não é alterada. A execução de uma Display-List pode alterar o valor de variáveis de estado OpenGL e essas alterações persistem após a execução da lista. Nem todos os comandos OpenGL podem ser registados numa display-list. Comandos que involvam parâmetros por referência ou devolvam um valor, não são registados dado que a lista pode ser executada fora do contexto em que determinadas variáveis foram definidas. Esses comandos são executados como se fossem invocados em modo imediato. 3. Display Lists Hierárquicas Podem criar-se display-lists hierárquicas, executando outras listas no corpo de uma lista inicial. Se pretendermos memorizar o estado do sistema antes de executar uma sub-lista e repôr esse mesmo estado após a sua execução, há que efectuar operações explícitas de push e pop de matrizes e atributos (glpushmatrix, glpushattrib, glpopmatrix, glpopattrib)

#define MY_CIRCLE_LIST 1 Display Lists: exemplo 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);

Gestão de de Listas e seus Índices A utilização directa e indiscriminada de índices para as listas a criar pode provocar efeitos indesejados, como o apagamento de uma lista, por utilização indevida do seu índice. GLuint glgenlists (Glsizei range); Aloca um número (range) de índices de display-lists contíguos e não utilizados. O valor de retorno corresponde ao índice que marca o início da série. Posteriores invocações desta função não devolvem os mesmos índices, a menos que tenham sido entretanto apagados. GLboolean glislist (Gluint list); Retorna TRUE se o valor list corresponder a um índice correntemente utilizado e FALSE caso contrário. Void gldeletelists (GLuint list, Glsizei range); Destroi um número range de listas, começando pelo índice especificado por list. A tentativa de apagar uma lista inexistente não produz qualquer efeito.

Selecção de de Objectos Em aplicações interactivas é fundamental que o sistema gráfico de base forneça um qualquer mecanismo de selecção de objectos ou partes de objectos presentes numa cena. O OpenGL fornece um mecanismo de selecção que automaticamente identifica os objectos que são desenhados sobre uma determinada região da janela corrente. É possível integrar e completar esse mecanismo numa função que permita identificar o objecto ou objectos seleccionados pelo utilizador através de um cursor gráfico ( picking ). Cursor Objectos Janela de Pick

O Modo de de Operação Selection Para utilizar o mecanismo de selecção do OpenGL começa-se por desenhar a cena no frame-buffer, comutar em seguida para o modo de operação Selection e invocar de novo os comandos necessários ao redesenho de toda a cena. Em modo Selection, o conteúdo do frame-buffer não é alterado, não obstante serem invocadas operações de desenho Quando se abandona o modo Selection, o sistema devolve um registo de todas as primitivas que teriam intersectado o volume de visualização (definido pelas transformações Projection e pelos planos de recorte adicionais), caso tivessem sido desenhadas. Cada primitiva nessas condições gera um selection hit. Cada selection hit regista um conjunto de nomes (valores inteiros) identificadores da primitiva e outros dados com ela relacionados - hit record. Os vários hit records são armazenados num mesmo array. O conjunto de identificadores inteiros registado para cada primitiva corresponde aos valores que estão presentes num stack de nomes ( name stack ) no instante em que é dada a ordem de desenho da primitiva. O conteúdo desse stack deve ir sendo alterado entre sucessivos comandos de desenho, de modo a distinguir diferentes primitivas (a identificação é hierárquica).

Passos para a activação do do Modo de de Selecção 1) Especificar o array a utilizar para o registo dos selection hits void glselectbuffer (GLsizei size, GLuint *buffer); size: número máximo de valores que podem ser armazenados buffer: ponteiro para um array de unsigned integers 2) Activar o modo Selection por invocação da função glrendermode com o valor GL_SELECT GLint glrendermode (GLenum mode); /* por defeito GL_RENDER */ Quando se comuta de GL_SELECT para GL_RENDER o valor devolvido pela função indica o número de selection hits que foram registados.

Passos para a activação do do Modo de de Selecção (cont.) 3) Inicializar o stack de nomes recorrendo às funções glinitnames e glpushname void glinitnames (void); Cria um Stack de Nomes vazio void glpushname (Gluint name); Através de uma operação de push, acrescenta uma entrada ao stack, com o valor name. Convém efectuar uma operação de push logo na fase de inicialização para que haja pelo menos uma entrada cujo valor pode depois ser redefinido por glloadname. 4) Definir o Volume de Visualização ( View Volume ) que se pretende utilizar para efeitos de selecção Sendo geralmente diferente do volume que se utiliza para efeitos de visualização, o estado das transformações deve ser gravado e reposto antes e depois do processo de selecção, com as funções glpushmatriz e glpopmatrix

Passos para a activação do do Modo de de Selecção (cont.) 5) Alternar comandos de desenho de primitivas com comandos de manipulação do stack de nomes. /* Com um só nível hierárquico */ glinitnames ( ); glpushname (-1); glloadname (1); drawoneobject (); glloadname (2); drawanotherobject (); glloadname (3); drawyetanotherobject (); Os comandos glpushname, glpopname e glloadname são ignorados se não se estiver em modo de selecção. O mesmo có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.

Operação de de Pick com base no no Mecanismo de de Selecção Utilizar uma Matriz de Picking, em conjugação com a matriz de projecção para restringir a selecção de primitivas a uma pequena região do viewport, tipicamente centrada na posição indicada por um cursor. Regras a considerar: 1) A rotina que define a Matriz de Pick deve ser invocada antes da definição da Projecção 2) A operação de pick é geralmente despoletada a partir de um evento proveniente de um dispositivo de interacção de tipo locator. void glupickmatrix (GLdouble x, GLdouble y, GLdouble width, GLdouble height, GLint viewport [4] ); x, y: centro da região de pick em coordenadas da janela (posição do cursor) width, height: dimensões da região de pick em coordenadas do ecrã (sensibilidade) viewport: limites do viewport corrente

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

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

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

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

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

Cálculos de de Iluminação Descreve-se a luz proveniente das fontes e a iluminação da superfície dos objectos com base num modelo cromático RGB. A côr de uma fonte de luz é definida pela percentagem (0 a 1) de luz vermelha, verde e azul que emite. Os materiais constituintes das superfícies a iluminar são caracterizados pela percentagem de luz vermelha, verde e azul recebida, que voltam a reflectir segundo variadas direcções. Uma mesma cena pode ser iluminada por mais que uma fonte de luz. Cada uma dessas fontes pode ser activada ou desactivada independentemente das restantes. Parte da luz provêm directamente das fontes de luz, de uma direcção e posição definidas, e parte provêm de direcção indefinida, como resultado de múltiplas reflexões da luz, proveniente das fontes, sobre os objectos da cena (luz ambiente). Pode definir-se uma componente de luz ambiente global, para a qual não é possível identificar sequer a fonte de origem. A iluminação de um objecto resulta da soma de 4 componentes distintas: luz emitida, luz ambiente, luz difundida e luz reflectida ou especular.

As As Várias Componentes de de 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 das Propriedades das Fontes e dos 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.

Representação de de uma Cena com Iluminação Para obter, em opengl, a representação de uma cena com cálculos de iluminação, há que efectuar, necessariamente, os seguintes passos: 1) Definir, para todos os objectos presentes na cena, os vectores normais a cada um dos seus vértices. 2) Criar, posicionar e seleccionar uma ou mais fontes de luz. 3) Definir os parâmetros do modelo de iluminação (características, como o nível de luz ambiente global e a localização efectiva do ponto de observação). 4) Definir, para todos os objectos presentes na cena, as propriedades ópticas dos respectivos materiais.

Criação e Activação de de Fontes de de Luz 1) Sucessivas invocações da função gllight*() permitem estabelecer diferentes características para uma dada fonte de luz gllight{if}[v] (Glenum light, Glenum pname, TYPE param); light: índice da fonte a parametrizar (GL_LIGHT0, GL_LIGHT1,, GL_LIGHT7) pname: indicação da característica que se pretende definir param: valor a atribuir à característica seleccionada 2) Deve preparar-se o sistema para executar cálculos de iluminação glenable (GL_LIGHTING); 3) Deve activar-se uma ou mais fontes de luz previamente parametrizadas glenable (lightindex); 4) Os cálculos de iluminação devem ser complementados com cálculos de remoção de superfícies ocultas. glenable (GL_DEPTH_TEST);

Propriedades de de uma Fonte de de Luz GL_AMBIENT: GL_DIFFUSE: GL_SPECULAR: GL_POSITION: (x, y, z, w) GL_SPOT_DIRECTION: GL_SPOT_EXPONENT: GL_SPOT_CUTOFF: valores RGBA para a intensidade da luz ambiente valores RGBA para a intensidade da luz difusa valores RGBA para a intensidade da luz especular se w = 0, fonte de luz direccional: posição infinita e direcção dada por (x, y, z) se w = 1, fonte de luz posicional, com posição dada por (x, y, z) em coord. de objecto. Raios divergentes. cutoff cos (θ) exponent direction GL_CONSTANT_ATTENUATION (Kc): GL_LINEAR_ATTENUATION (Kl): GL_QUADRATIC_ATTENUATION (Kq): attenuation factor = d: distância da fonte ao vértice 1 Kc + Kl.d + Kq.d 2

Fontes de 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. 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)

Modelo 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).

Parametrização do do Modelo de de Iluminação Luz Ambiente Global Valores de RGBA para a intensidade da luz ambiente que não é possível relacionar com uma dada fonte de luz. Graças a esta componente luminosa, é possível visualizar os objectos presentes na cena mesmo que não se defina qualquer fonte de luz. Glfloat ambient_light [ ] = { 0.2, 0.2, 0.2, 1.0} gllightmodelfv (GL_LIGHT_MODEL_AMBIENT, ambient_light); Ponto de Observação Infinito ou Local Com o ponto de observação no infinito, a direcção de visualização é igual em todos os vértices da cena, o que simplifica os cálculos de iluminação (situação por defeito). Com um ponto de observação finito essa direcção varia (e torna mais realistas o cálculo das regiões especulares). gllightmodeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE Iluminação por Tipo de Faceta Decidir se são efectuados cálculos de iluminação para backfaces depois de invertidos os seus vectores normais (caso afirmativo, podem definir-se materiais diferentes para front e backfaces). gllightmodeli (GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE

Definição das Propriedades dos Materiais Sucessivas invocações da função glmaterial*() permitem estabelecer as diferentes características ópticas do material corrente. glmaterial{if}[v] (Glenum face, Glenum pname, TYPE param); face: tipos de facetas considerados (GL_FRONT, GL_BACK, GL_FRONT_AND_BACK) pname: indicação da característica que se pretende definir param: valor a atribuir à característica seleccionada GL_AMBIENT: GL_DIFFUSE: GL_AMBIENT_AND_DIFFUSE: GL_SPECULAR: GL_SHININESS: GL_EMISSION: percentagens RGBA para a luz ambiente reflectida percentagens RGBA para a luz difusa reflectida mesmos RGBA para componentes ambiente e difusa percentagens RGBA para a luz especular reflectida grau de especularidade do material (0 a 128). Quanto maior o valor, mais pequena e brilhante a zona especular valores RGBA para a intensidade da luz emitida pelo próprio material (Não influencia a iluminação de outros objectos, ou seja, não actua como fonte de luz)

Método Alternativo de de Definição de de Propriedades Invocações à função glcolormaterial permitem definir, para determinados tipos de faces, quais as propriedades ópticas de um material que herdam automaticamente os valores da côr de desenho corrente, definida por glcolor. glcolormaterial (GLenum face, Glenum mode); face: mode: tipos de facetas considerados (GL_FRONT, GL_BACK, GL_FRONT_AND_BACK) selecção de uma propriedade susceptível de ser definida por um grupo RGBA Para que o efeito de glcolormaterial se faça sentir, é necessário activar uma variável de estado: glenable (GL_COLOR_MATERIAL);

A Matemática dos Cálculos de de Iluminação Em modo cromático RGBA, os cálculos necessários à determinação da côr a atribuir a um dado vértice são: VertexColor = emission material + ambient lightmodel * ambient material + n -1 [ 1 / ( K c + Kl. d + K q.d 2 ) ] i * (spotlight_effect) * i i = 0 [ ambient light * ambient material + (max {l. n, 0}) * diffuse light * diffuse material + (max {s. n, 0}) shininess * specular light * specular material ] i n: versor normal ao vértice l: versor que aponta do vértice para a fonte de luz s: versor na direcção da soma entre l e o vector que une o vértice ao ponto de observação

Demonstração light & material Usar a aplicação light & material para mostrar o efeito da alteração de: Componentes de iluminação; Materiais; Atenuação da intensidade luminosa; Aplicação da iluminação às duas faces de polígonos (usar a rosa).

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