introdução ao opengle à programação baseada em … · • activaoudesactivaum dado estado...

81
Licenciatura em Engenharia Informática e de Computadores Computação Gráfica Introdução ao OpenGL e à Programação Baseada em Acontecimentos © 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa Edward Angel, Cap. 2

Upload: hoangminh

Post on 27-Jan-2019

213 views

Category:

Documents


0 download

TRANSCRIPT

Licenciatura em Engenharia Informática e de Computadores

Computação Gráfica

Introdução ao OpenGL e à Programação Baseada em Acontecimentos

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

Edward Angel, Cap. 2

LEIC CGAPI Gráfica

� Interface de software para hardware gráfico

� Fornece funções de baixo nível� Que permitem aceder ao hardware gráfico

� Exemplos de API’s Gráficas� OpenGL

� DirectX

� ThreeJS

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEICCG

Compreender o OpenGLIntrodução ao OpenGL

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGAPI Gráfica (OpenGL)

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

Application

GDI

Display Device

OpenGL

Hardware Driver

LEIC CGOpenGL

� Standard da indústria

� Hardware independent e OS independent

� Não oferece comandos para: � Gestão de janelas

� Obter input do utilizador

� Não tem suporte de alto nível para descrição de modelos 3D� Apenas suporta primitivas básicas

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGO que fornece o OpenGL

� Desenho com pontos, linhas, e polígonos.

� Transformações

� Remoção de superfícies ocultas (Z-Buffer)

� Efeitos de iluminação

� Sombreamento Gouraud e Constante (não Phong)

� Mapeamento de texturas

� Operações sobre pixeis

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGBibliotecas OpenGL� OpenGL Library - GL

� Biblioteca básica para aceder ao hardware gráfico� OpenGL32 no Windows� GL na maioria dos sistemas unix/linux (libGL.a )

� OpenGL Utility Library - GLU� Fornece funções utilitárias baseadas na biblioteca OpenGL

� GLX / WGL / AGL� Bibliotecas dependentes do SO � Ligam o OpenGL library ao sistema de janelas� GLX para X-window, WGL para win32, AGL para Apple

� OpenGL Utility Toolkit – GLUT� Toolkit independente do SO � “Esconde” as complexidades de usar diferentes sistemas de janelas

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGOpenGL Utility Toolkit - GLUT

� Funções usam o prefixo glut. (ex: glutDisplayFunc())

� Oferece as seguintes operações:� Inicializar e criar janelas

� Manipular acontecimentos da janela e de input

� Desenho de objectos tridimensionais básicos• Cubo, Esfera, Teapot ☺

� Execução do programa

� Todas estas operações são baseadas em acontecimentos

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGOpenGL Utility Toolkit - GLUT

� Onde encontrar a GLUT? � para Win32 e Unix:

www.opengl.org/resources/libraries/glut/

� para Mac OS X:developer.apple.com/mac/library/samplecode/glut/

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGOrganização do Software

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGComo compilar

� Em Microsoft Visual C++:� Criar novo projecto (Win32 Console Application)

� Abrir a caixa de diálogo “Project Settings” • Adicionar em Link/Objects/Library

� opengl32.lib

� glu32.lib

� glut32.lib

� Escrever o vosso código OpenGL

� Compilar e correr

…e já está !!! ☺

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEICCG

Programar em OpenGLIntrodução ao OpenGL

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGSintaxe dos comandos OpenGL

� Comandos OpenGL usam o prefixo gl e capitalizam a primeira letra de cada palavra

glPopMatrix()

� As constantes definidas no OpenGL começam com GL_, usam apenas letras maíusculas e underscores separam as palavras

GL_MODELVIEW_MATRIX

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGSintaxe dos comandos OpenGL

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

glVertex3f(…)Prefixo

OpenGLComando Número de

argumentosTipo de

argumentos

LEIC CGSintaxe dos comandos OpenGL

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

gl Vertex 3f (x,y,z)

Pertence à biblioteca GL

Função “Vértice”

x,y,z são floats

glVertex3f v(p)

p é um ponteiro para um array

3 dimensões

LEIC CGTipos de Dados no OpenGL

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

Tipo OpenGL Representa Equiv. em C Sufixo

GLbyte 8-bit integer signed char b

GLshort 16-bit integer short s

GLint, GLsizei 32-bit integer int or long i

GLfloat 32-bit floating float f

Glclampf 32-bit foating (clamped to [0,1])

GLdouble 64-bit floating double d

GLclampd 64-bit floating (clamped to [0,1])

Glubyte 8-bit unsigned integer unsigned char ub

GLuboolean 8-bit unsigned integer unsigned char ub

GLushort 16-bit unsigned integer unsigned short us

GLuint, GLenum 32-bit unsigned integer unsigned long ui

GLbitfield 32-bit unsigned integer

LEIC CGOpenGL - Máquina de Estados

� OpenGL é uma máquina de estados� Definem-se os estados (modos) e estes manter-se-ão em

efeito até serem alterados explicitamente• Exemplo: a cor actual é um estado

� Cada variável de estado (modo) tem um valor por omissão

� Em qualquer altura pode-se questionar o sistema sobre o estado actual

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGOpenGL - Máquina de Estados

� glEnable(GLenum); glDisable(GLenum);

• Activa ou Desactiva um dado estado

� glIsEnabled(GLenum);

• Verifica se um dado estado está activado

� glGetBooleanv(GLenum);

� glGetIntegerv(GLenum);

� glGetFloatv(GLenum);

� glGetDoublev(GLenum);

� glGetPointerv(GLenum);

• Interroga o sistema sobre o estado de uma determinada variável

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGOpenGL - Máquina de Estados

� Exemplo:…

if (glIsEnabled(GL_LIGHTNING)){

} else {

glGetFloatv(GL_CURRENT_COLOR, &c) ;

glColor4f(1.0, 0.0,0.0,1.0);

glGetFloatv(GL_CURRENT_COLOR, &c) ;

}

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGRepresentação da Cor

� RGBA� 4 canais : Red, Green, Blue e Alpha.

� Cada canal representa intensidade entre 0.0 ~ 1.0• Valores fora deste intervalo transformados em 0.0 ou 1.0

� Alpha é usado na transparência (e blending)• Exemplos

glColor4f(0.0, 1.0, 0.0, 1.0); // Verde

glColor4f(1.0, 1.0, 1.0, 1.0); // Branco

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGOpenGL #defines

� Constantes estão definidas nos ficheiros include

� gl.h, glu.h and glut.h

� Nota: #include <GL/glut.h> deve incluir todos

� Exemplos� glBegin(GL_POLYGON)

� glClear(GL_COLOR_BUFFER_BIT)

� Ficheiros include também definem tipos de dados:� GLfloat, GLdouble,…

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGOrientado a Objectos?

� OpenGL não é orientado a objectos

� Existem múltiplas funções para uma única função� glVertex3f

� glVertex2i

� glVertex3fv

� Seria fácil fazer overload em C++, mas sacrificava-se a eficiência

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGOrientado a Objectos?

� OpenGL não é orientado a objectos…

� ...mas as aplicações de CG interactiva geralmente são� Orientadas a objectos

� Baseadas em acontecimentos

� Vão desenvolver uma nos laboratórios!

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEICCG

Programação Baseada em Acontecimentos

Introdução ao OpenGL

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGContexto Histórico

Antes das aplicações interactivas de manipulação directa

� Arquitecturas de interacção eram muito simples:� Programas sequenciais

� Interpretadores linha de comandos (DOS, UNIX)

� Programa controla e pede entradas

� Utilizadores esperam pelo programa

� Utilizadores introduzem informação

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGProgramas sequenciais� Abordagem típica

Loop (forever)

Programa lê comando do utilizador

Programa analisa entrada

Programa avalia o resultado

Possivelmente gera saídas

End (loop)

� Problema:

� Como tratar múltiplas acções?

� Como tratar acontecimentos assíncronos?

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGModelo de Acontecimentos� Modelo desenvolvido para suportar criação de Interfaces

de Manipulação Directa

� Permite comunicação entre � objectos interactivos e o sistema de entradas/saídas� os próprios objectos entre si

� Programa não espera pelo utilizador� Continua a processar acontecimentos, se estes acontecerem,

• mesmo sem input dos utilizadores

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGModelo de Acontecimentos

� Comunicação realizada via Acontecimentos (Event)

� Acontecimento = algo interessante

� Tecla premida

� Janela redimensionada

� Acabou o tempo de vida do meu personagem

� …

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGModelo de AcontecimentosAcontecimentos armazenados em

lista de acontecimentosGestão da lista de acontecimentos assegura

que acontecimentos são tratados pela ordem em que acontecem

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

Mouse Move

Key Press

Event Queue

LEIC CGRegisto e Funções de Retorno� Existem inúmeros acontecimentos a acontecer no

sistema

� Nem todos nos interessam

� Aplicação deve indicar explicitamente quais os acontecimentos “interessantes”

� Registo e Funções de Retorno (callback)� Regista-se função de retorno a acontecimentos “interessante”

� Esta função deve “tratar” desse acontecimento

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CG

Registo e Funções de Retorno

Exemplo� Registo de função de retorno

void glutKeyboardFunc( TeclaPremida )

� Função de Retorno

void TeclaPremida(unsigned char key, int x, int y){

if (key==‘Q’||key==‘q’)

movimento = CIMA;

}

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGOpenGL e GLUT

� OpenGL não é baseado em acontecimentos “per se”

� GLUT fornece mecanismo básico de gestão de acontecimentos em OpenGL

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGGestão de Acontecimentos com GLUT

int main(int argc, char ** argv){

glutInit(&argc, argv);………glutReshapeFunc(reshape);glutDisplayFunc(display);………glutMainLoop();return 0;

}© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

InicializaçãoRegisto

de Acontecimentos

Ciclo Principal

LEICCG

Desenhar Objectos GeométricosIntrodução ao OpenGL

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGDetalhes de um programa

� #1: Inicializar e criar a janela� void glutInit(int, char**);

• Inicializa a biblioteca GLUT

• Deve ser invocado antes de chamar qualquer rotina da GLUT

� void glutInitDisplayMode(unsigned int);

• Especifica o modo de display da janela criada� GLUT_RGBA / GLUT_INDEX

� GLUT_SINGLE / GLUT_DOUBLE

� GLUT_DEPTH, GLUT_STENCIL, GLUT_ACCUM, …

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGDetalhes de um programa

� #1: Inicializar e criar a janela

glutInit(&argc, argv);

• Inicializa a biblioteca GLUT com os parâmetros do main

glutInitDisplayMode(GLUT_RGBA|GLUT_SINGLE);

• Especifica o modo de display da janela criada como sendo RGBA e single-buffer (modos por omissão)

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGDetalhes de um programa

� #1: Inicializar e criar a janela� void glutInitWindowSize(int, int);

• Define a dimensão da janela: largura, altura

� void glutInitWindowPosition(int, int);

• Define a posição da janela no dispositivo

• Origem no canto superior esquerdo

� int glutCreateWindow(char*);

• Cria uma janela com o nome especificado

• Utilizada as definições indicadas nas funções anteriores

• Retorna um identificador único da janela

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGDetalhes de um programa

� #1: Inicializar e criar a janela

void glutInitWindowSize(int width, int height);

void glutInitWindowPosition(int x, int y);

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGDetalhes de um programa� #1: Inicializar e criar a janela

glutInitWindowSize(400, 400);� A janela terá 400px largura por 400px de altura

glutInitWindowPosition(-1, -1);� É o SO a decidir onde vai ficar a janela

int i = glutCreateWindow(“Teste”);� Cria a janela com o nome “teste” e retorna o identificador

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGDetalhes de um programa

� #2: Processar acontecimentos da janela e de input

� Registar funções de callback para processar os acontecimentos• Estas funções são chamadas quando um acontecimento é despoletado

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

• Define a função a ser chamada quando o conteúdo da janela necessitar de ser redesenhado

• É dentro desta função de callback que se coloca o que se quer desenhar na janela

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGDetalhes de um programa

� #2: Processar acontecimentos da janela e de input� Registar funções de callback para processar os acontecimentos

• Estas funções são chamadas quando um acontecimento é despoletado

� glutReshapeFunc(void (*func)(int, int));

• Define a função a ser chamada quando a janela é movida ou redimensionada

• Deve-se definir aqui as coordenadas do viewport

� glutKeyboardFunc();

� glutMouseFunc();

� glutIdleFunc();

� …

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGDetalhes de um programa

� #3: Correr o ciclo principal

� void glutMainLoop(void);

• Esta função entra na rotina de processamento de acontecimentos

• Deve ser invocada uma única vez

• Depois de chamada, entra em ciclo e não sai

• Irá invocar funções de callback sempre que necessário

(as que estiverem registadas)

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGDetalhes de um programa� #2: Processar acontecimentos da janela e de

input

glutDisplayFunc(myDisplay);� Regista a função void myDisplay() como callback para o

desenho na janela

glutReshapeFunc(myReshape); � Regista a função void myReshape() como callback para o

redimensionamento ou movimento da janela

� #3: Correr o programa

glutMainLoop();

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGAgora tudo…

void main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize (400, 400);

glutInitWindowPosition (-1, -1);

glutCreateWindow(“Teste");

glutDisplayFunc(myDisplay);

glutReshapeFunc(myReshape);

glutMainLoop();

}

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CG…tudo!?

void main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize (400, 400);

glutInitWindowPosition (-1, -1);

glutCreateWindow(“Teste");

glutDisplayFunc(myDisplay);

glutReshapeFunc(myReshape);

glutMainLoop();

}

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGAinda não é tudo!

void main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize (400, 400);

glutInitWindowPosition (-1, -1);

glutCreateWindow(“Teste");

glutDisplayFunc ( myDisplay );

glutReshapeFunc ( myReshape);

glutMainLoop();

}© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

� #1: Definir o viewport� void glViewport(Glint, GLint, Glsizei, GLsizei);

• Define a transformação afim que faz o mapeamento janela-viewport� Mapeamento janela-viewport: já têm uma ideia, mas iremos voltar aqui

� Transformação afim: a abordar em breve

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

� #1: Definir o viewport� void glViewport(Glint, GLint, Glsizei, GLsizei);

x y w h

LEIC CGReshape callback function

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

� #1: Definir o viewportglViewport(0, 0, window_width, window_height);

LEIC CGReshape callback function

� #2: Definir a projecção� void glMatrixMode(GLenum);

• Especifica qual é a pilha de matrizes que estará “activa”� As operações subsequentes irão afectar esta pilha

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

� #2: Definir a projecção� glMatrixMode(GL_PROJECTION);

• Especifica que a matriz de projecção é a “actual”

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

� #2: Definir a projecção� glMatrixMode(GL_PROJECTION);

• Especifica que a matriz de projecção é a “actual”

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

� #2: Definir a projecção� void glLoadIdentity(void);

• Substitui o conteúdo da matriz no topo da pilha actual pela identidade� Referida como matriz actual (current matrix)

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

� #2: Definir a projecção� void glLoadIdentity(void);

• Substitui o conteúdo da matriz no topo da pilha actual pela identidade � Referida como matriz actual (current matrix)

LEIC CGReshape callback function

� #2: Definir a projecção� void glOrtho( Gldouble left, Gldouble right, Gldouble

bottom, Gldouble top, Gldouble nearVal, GldoublefarVal);

• Define o volume de visualização para projecção paralela ortogonal� Por omissão a câmara está na origem

• Multiplica a matriz actual por uma transformação de projecção

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

� #2: Definir a projecção

glOrtho( -2.0f, 2.0f, -2.0f, 2.0f, -2.0f, 2.0f);

left right bottom top -near -far

(-2, -2, 2)

(2, 2, -2)

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

� #2: Definir a projecção

glOrtho( -2.0f, 2.0f, -2.0f, 2.0f, -2.0f, 2.0f);

left right -near -farbottom top

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

� #2: Definir a projecção

glOrtho( -2.0f, 2.0f, -2.0f, 2.0f, -2.0f, 2.0f);

left right -near -farbottom top

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

� #3: Inicializar a matriz de modelação-visualização

� glMatrixMode(GL_MODELVIEW);

• Especifica que a matriz de modelação-visualização é a “actual”

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

� #3: Inicializar a matriz de modelação-visualização

� glMatrixMode(GL_MODELVIEW);

• Especifica que a matriz de modelação-visualização é a “actual”

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

� #3: Inicializar a matriz de modelação-visualização

� glMatrixMode(GL_MODELVIEW);

• Especifica que a matriz de modelação-visualização é a “actual”

� glLoadIdentity();

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

� #3: Inicializar a matriz de modelação-visualização

� glMatrixMode(GL_MODELVIEW);

• Especifica que a matriz de modelação-visualização é a “actual”

� glLoadIdentity();

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGReshape callback function

void myReshape(GLsizei w, GLsizei h) {

glViewport(0, 0, w, h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, -2.0f, 2.0f);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGDisplay callback function

� Passos fundamentais:

�#1: Limpar os buffers

�#2: Descrever Pontos, Linhas, e Polígonos

�#3: Forçar o processamento do desenho

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CG

Display callback function

#1: Limpar os buffers� glClearColor (…); glClearDepth (…);

� Definem os valores a serem usados (clearing values) nalimpeza dos buffers de cor ou profundidade

� glClear (GLbitfield mask);� Limpa os buffers especificados em mask, de acordo com os

clearing values definidos• GL_COLOR_BUFFER_BIT,

• GL_DEPTH_BUFFER_BIT,

• …

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CG

Display callback function

#1: Limpar os buffers

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

void glClear(GL_COLOR_BUFFER_BIT);

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CG

� Especificar a cor� void glColor {34}{sifd}[v](TYPE colors);

� Descrever as primitivas� void glBegin(GLenum mode);

• Marca início de uma lista de vértices

• mode indica que tipo de primitiva é (vamos ver a seguir)

� void glEnd();

• Marca o fim da lista de vértices

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

Display callback function

#2: Pontos, Linhas e Polígonos

LEIC CG

Display callback function

#2: Pontos, Linhas e Polígonos

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

Value Meaning

GL_POINTS individual points

GL_LINES pairs of vertices interpreted as individual line

segments

GL_LINE_STRIP serious of connected line segments

GL_LINE_LOOP same as above, with a segment added between

last and first vertices

GL_TRIANGLES triples of vertices interpreted as triangles

GL_TRIANGLE_STRIP linked strip of triangles

GL_TRIANGLE_FAN linked fan of triangles

GL_QUADS quadruples of vertices interpreted as four-sided

polygons

GL_QUAD_STRIP linked strip of quadrilaterals

GL_POLYGON boundary of a simple, convex polygon

LEIC CG

Display callback function

#2: Pontos, Linhas e Polígonos

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

GL_QUAD_STRIP

GL_POLYGON

GL_TRIANGLE_STRIP

GL_TRIANGLE_FAN

GL_POINTS

GL_LINES

GL_LINE_LOOP

GL_LINE_STRIP

GL_TRIANGLES

LEIC CG

Display callback function

#2: Pontos, Linhas e Polígonos� Chamadas válidas entre glBegin () e glEnd ()

� glVertex*(); glNormal*(); glColor*(); glIndex*(); glTexCoord*(); glMaterial*(); …

� Especificação de vértices� glVertex{234}{sifd}[v](TYPE coords);

• Especificação do vértice a ser usado na descrição do objecto • Só tem efeitos se invocado entre glBegin() e glEnd()

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CG

Display callback function

#2: Pontos, Linhas e Polígonos� OpenGL apenas desenha correctamente polígonos

que sejam:� Simples: arestas não se cruzam

� Planares: todos os vértices estão no mesmo plano

� Convexos: todos os pontos num segmento de recta entre quaisquer dois vértices no polígono pertencem ao polígono

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

V0 V1

V2 V3

LEIC CG

Display callback function

#2: Pontos, Linhas e Polígonos� OpenGL apenas desenha correctamente polígonos

que sejam:� Simples: arestas não se cruzam

� Planares: todos os vértices estão no mesmo plano

� Convexos: todos os pontos num segmento de recta entre quaisquer dois vértices no polígono pertencem ao polígono

� Validar condições acima� Resultados inesperados se não respeitadas

� Triângulos satisfazem sempre estas condições

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CG

Display callback function

#2: Pontos, Linhas e Polígonos

glColor3f(1.0f, 1.0f, 1.0f);

glBegin(GL_POLYGON);

glVertex3f(-1.0f, -1.0f, 0.0f);

glVertex3f(1.0f, -1.0f, 0.0f);

glVertex3f(1.0f, 1.0f, 0.0f);

glVertex3f(-1.0f, 1.0f, 0.0f);

glEnd();

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CG

Display callback function

#3: Forçar processamento� void glFlush (…);

� Força todos os comandos a serem processados• Diferentes implementações do GL usam buffers de comandos em

locais distintos, incluindo buffers de rede e aceleradores gráficos

• Esta chamada “esvazia” estes buffers, fazendo com que os comandossejam processados pelo rendering engine

� Deve ser invocada sempre que o desenho estiver terminado• Especialmente quando se fica à espera de input do utilizador que

depende da imagem gerada

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGDisplay callback function

void myDisplay(void) {

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0f, 1.0f, 1.0f);

glBegin(GL_POLYGON);

glVertex3f(-1.0f, -1.0f, 0.0f);

glVertex3f(1.0f, -1.0f, 0.0f);

glVertex3f(1.0f, 1.0f, 0.0f);

glVertex3f(-1.0f, 1.0f, 0.0f);

glEnd();

glFlush();

}© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

#1

#2

#3

LEIC CG

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

#include <GL/glut.h>

void myReshape(GLsizei w, GLsizei h) {glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, -2.0f, 2.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();

}

void main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize (400, 400);glutInitWindowPosition (-1, -1); glutCreateWindow("Teste"); glutDisplayFunc(myDisplay);glutReshapeFunc(myReshape);glutMainLoop();

}

void myDisplay(void) {glClearColor(0.0f, 0.0f, 0.0f, 0.0f);glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f, 1.0f, 1.0f);glBegin(GL_POLYGON);

glVertex3f (-1.0f, -1.0f, 0.0f);glVertex3f (1.0f, -1.0f, 0.0f);glVertex3f (1.0f, 1.0f, 0.0f);glVertex3f (-1.0f, 1.0f, 0.0f);

glEnd();glFlush();

}

LEIC CGResultado final

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGCiclo Update/Display

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CG

E o trabalho de laboratório é… Micro Machines:

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CG... mas mais parecido com:

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

LEIC CGNa próxima aula

Enquadramento e Conceitos Fundamentais

Conceitos básicos de Computação Gráfica

Modelo Conceptual de um Sistema Gráfico Interactivo

Dispositivos de SaídaMatemática para CG (inclui trigonometria e matrizes)

© 2015 Corpo docente de Computação Gráfica / CG&M / DEI / IST / ULisboa

Edward Angel, Cap. 3