Introdu ção ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/cgr/IntroOpenGL.pdf2 Introdu...

7
1 Introdu Introduç ão ao ão ao OpenGL OpenGL Leandro Tonietto Processamento Gráfico / Computação Gráfica Jogos Digitais [email protected] http://www.inf.unisinos.br/~ltonietto Mar-2008 Alguns slides são provenientes da apresentação do professor Christian Hofsetz Sum Sumário rio Introdução Programando com OpenGL Exemplos Introdu Introdução ão O que é OpenGL? [1] Open Graphics Library Interface de software para hardware gráfico. É uma biblioteca de modelagem e gráficos 3D, altamente portável e muito rápida. Independente de SO e de hardware. Muito mais rápido do que implementação puramente em software, como: motores de gráficos ou software de ray-tracing. Introdu Introdução ão Inicio: Biblioteca gráfica desenvolvida para rodar aplicações gráficas sobre o hardware proprietário da Silicon Graphis Inc. (SGI). Primeira versão foi o IRIS GL, biblioteca gráfica das estações IRIS Graphics da SGI. Hardware que provia transformações de matrizes com altíssima performance. OpenGL surge da decisão de portar a IRIS GL para um padrão aberto, para suportar outros fabricantes de dispositivos gráficos, outras plataformas de hardware e outros sistemas operacionais. Introdu Introdução ão OpenGL ARB: API aberta não pode ser de propriedade de uma empresa apenas. Surge então o OpenGL Architecture Review Board (ARB) Consórcio, originalmente, formado por SGI, Digital Equipament Corporation, IBM, Intel e Microsoft. Outras empresas fazem parte do consórcio, como: SUN, nVIDIA, ATI, ... 01/07/1992 sai a primeira versão da especificação da OpenGL. A partir de 2006 SGI transfere o controle sobre o padrão OpenGL para o grupo de trabalho The Khronos Group (www.khronos.org ). Atualmente, este grupo promove o OpenGL e outros padrões como o OpenGL ES (para dispositivos móveis). OpenGL está na versão 2.0. Introdu Introdução ão Software x hardware: SW tem muito menos performance que HW e alguns efeitos especiais podem ser proibitivos nas aplicações gráficas. SW pode executar em qualquer plataforma sem que o usuário necessite de hardware especial, no caso hardware gráfico. HW tem performance, porém maior custo. OpenGL interage com o hardware. Uma aplicação gráfica que use a OpenGL necessitará que o dispositivo gráfico (placa-de- vídeo) e o driver gráfico implementem a especificação da OpenGL.

Transcript of Introdu ção ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/cgr/IntroOpenGL.pdf2 Introdu...

Page 1: Introdu ção ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/cgr/IntroOpenGL.pdf2 Introdu ção Como funciona a OpenGL API Procedural. Programador invoca comandos OpenGL para

1

IntroduIntroduçção ao ão ao OpenGLOpenGL

Leandro Tonietto

Processamento Gráfico / Computação Gráfica

Jogos Digitais

[email protected]

http://www.inf.unisinos.br/~ltonietto

Mar-2008

Alguns slides são provenientes da apresentação do professor Christian Hofsetz

SumSumááriorio

IntroduçãoProgramando com OpenGLExemplos

IntroduIntroduççãoão

O que é OpenGL? [1]Open Graphics Library

Interface de software para hardware gráfico.É uma biblioteca de modelagem e gráficos 3D, altamente portável e muito rápida.

Independente de SO e de hardware.

Muito mais rápido do que implementação puramente em software, como: motores de gráficos ou software de ray-tracing.

IntroduIntroduççãoão

Inicio:Biblioteca gráfica desenvolvida para rodar aplicações gráficas sobre o hardware proprietário da SiliconGraphis Inc. (SGI).Primeira versão foi o IRIS GL, biblioteca gráfica das estações IRIS Graphics da SGI.Hardware que provia transformações de matrizes com altíssima performance.OpenGL surge da decisão de portar a IRIS GL para um padrão aberto, para suportar outros fabricantes de dispositivos gráficos, outras plataformas de hardware e outros sistemas operacionais.

IntroduIntroduççãoão

OpenGL ARB:API aberta não pode ser de propriedade de uma empresa apenas.Surge então o OpenGL Architecture Review Board (ARB)

Consórcio, originalmente, formado por SGI, Digital EquipamentCorporation, IBM, Intel e Microsoft. Outras empresas fazem parte do consórcio, como: SUN, nVIDIA, ATI, ...01/07/1992 sai a primeira versão da especificação da OpenGL.A partir de 2006 SGI transfere o controle sobre o padrão OpenGL para o grupo de trabalho The Khronos Group(www.khronos.org).

Atualmente, este grupo promove o OpenGL e outros padrões como o OpenGL ES (para dispositivos móveis).

OpenGL está na versão 2.0.

IntroduIntroduççãoão

Software x hardware:SW tem muito menos performance que HW e alguns efeitos especiais podem ser proibitivos nas aplicações gráficas.SW pode executar em qualquer plataforma sem que o usuário necessite de hardware especial, no caso hardware gráfico.HW tem performance, porém maior custo.OpenGL interage com o hardware. Uma aplicação gráfica que use a OpenGL necessitará que o dispositivo gráfico (placa-de-vídeo) e o driver gráfico implementem a especificação da OpenGL.

Page 2: Introdu ção ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/cgr/IntroOpenGL.pdf2 Introdu ção Como funciona a OpenGL API Procedural. Programador invoca comandos OpenGL para

2

IntroduIntroduççãoão

Como funciona a OpenGLAPI Procedural. Programador invoca comandos OpenGL para compor uma cena.De forma mais básica, os objetos são desenhados com primitivas gráficas: pontos, linhas e polígonos em 3D. Permite visualização de objetos em qualquer ponto de um espaço 3D.OpenGL suporta também iluminação e sombra, mapeamento de textura, blending, transparência, animação e diversos outros efeitos especiais.Faz a conversão das primitivas para imagem – rasterização.Não possui funcionalidades para gerenciamento de janela, interação com o usuário ou acesso a arquivos (I/O). Énecessário utilizar alguma biblioteca adicional (GLUT)Também não existe nenhum formato de arquivo associado ao OpenGL para modelos ou ambientes virtuais. O programador deve fazer a carga e interpretação dos formatos de arquivos comuns e converter para primitivas gráficas.

IntroduIntroduççãoão

Como funciona a OpenGLOpenGL em software x em hardware

X

Implementação MicrosoftProcessamento passa por GDI Mais lentaLimitação de funcionalidades

Implementação no driver do HWComunicação direta com dispositivoMais lento

IntroduIntroduççãoão

Como funciona a OpenGLPipeline OpenGL

Aplicação executa chamadas as funções da API da OpenGL.Comandos e dados (vértices, textura e etc) são armazenados no command buffer. Quando do “flush” os vértices passam pelo processamento matemático (transformações geométricas e de iluminação)Depois é feita a rasterização para cria uma imagem colorida a partir da geometria, cor e dados de textura.A imagem é colocada num framebuffer, que é a memória do dispositivo gráfico.

Programando com Programando com OpenGLOpenGL

Bibliotecas OpenGLMicrosoft Windows � opengl32.dll

OpenGL utility library (GLU) � glu32.dll

Conjunto de funções utilitárias para tarefas comuns e complexas, algumas matrizes especiais para cálculo e suporte para curvas e superfícies.

Headers:gl.h � header de prototipação das funções OpenGLglu.h � header de prototipação das funçoes GLU

Exemplo de “#include” para um programa OpengGL:#include <windows.h> // não vem no VisualC++ Express

#include <gl/gl.h>

#include <glu/glu.h>

#include “glee.h” // extensões da OpenGL

#include “glut.h” // freeglut

Programando com Programando com OpenGLOpenGL

Tipos de dados para se usar com a API OpenGL

Programando com Programando com OpenGLOpenGL

Convenção de nomes

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

glVertex3i(0, 0, 0);

glVertex3v(vertex[0]);

Page 3: Introdu ção ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/cgr/IntroOpenGL.pdf2 Introdu ção Como funciona a OpenGL API Procedural. Programador invoca comandos OpenGL para

3

Programando com Programando com OpenGLOpenGL

Convenção de nomesComeçam com gl...

Próximas palavras começa com a primeira letra maiúscula.

glBegin()

Constantes começam com GL_ e são sempre em maiúsculas.

GL_COLOR_BUFFER_BIT

Programando com Programando com OpenGLOpenGL

Lembre-se: OpenGL é máquina de estados, desenha primitivas e o estado das variáveis altera o resultado da síntese da imagem.

Um objeto é desenhado com a cor que está definida, com iluminação que está definida, com as transformações previamente definidas e etc.Portanto, um vez definida um propriedade, ela ficará “residente”até tenha o seu estado limpo ou alterado com outro valor.Por exemplo, quando uma cor é definida ela será usada em qualquer processo de colorização até que ocorra um novo comando de cor.

OpenGL faz interação com usuário, portanto, não gerencia entrada e saída de dados. É necessário o uso de alguma biblioteca para gerenciamento de GUI. Padrão GLUT.

Programando com Programando com OpenGLOpenGL

Como uma máquina de estados, os comandos também podem ter seu estado definido/alterado apenas como ligado ou desligado.

glEnable() e glDisable()

É o caso da iluminação:glEnable(GL_LIGHTING)

CUIDADO: a troca frequente de estados afeta a performance. O melhor é “setar” os estados uma vez só, quando possível.

Programando com Programando com OpenGLOpenGL

Desenho de primitivas:Basicamente, é a definição dos vértices das primitivas e das propriedades de cor, normais, texturas e etc.Tudo definido entre glBegin(<primitiva>) e glEnd()

Exemplo:glBegin(GL_TRIANGLES);

glColor3f(0.0, 0.0, 1.0);

glVertex3f(0.0, 0.0, 0.0);

glVertex3f(1.0, 0.0, 0.0);

glVertex3f(0.5, 0.5, 0.0);

glEnd();

Outros comandos utilizados dentro do bloco:glColor*(), glNormal*(), glMaterial*()

Programando com Programando com OpenGLOpenGL

Primitivas:

Todos pontos = 1 polígonoGL_POLYGON

Série de quads. conectadosGL_QUAD_STRIP

4 pontos = 1 quadriláteroGL_QUADS

Todos tri compartilham ponto zeroGL_TRIANGLE_FAN

Série de triângulos conectadosGL_TRIANGLE_STRIP

3 pontos = 1 triânguloGL_TRIANGLES

= strip + 1 linha para fecharGL_LINE_LOOP

Pontos conectados por linhasGL_LINE_STRIP

Par de vértices = 1 linhaGL_LINES

Pontos individuaisGL_POINTS

DescriçãoPrimitiva / Constante

Programando com Programando com OpenGLOpenGL

Primitivas:

Page 4: Introdu ção ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/cgr/IntroOpenGL.pdf2 Introdu ção Como funciona a OpenGL API Procedural. Programador invoca comandos OpenGL para

4

Programando com Programando com OpenGLOpenGL

Primitivas. Exemplos:

glBegin(GL_POLYGON); // ou glBegin(GL_POINTS);

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

Programando com Programando com OpenGLOpenGL

Tipos de polígonos:

Válidos Inválidos

Programando com Programando com OpenGLOpenGL

Objetos curvos são aproximados por retas:

Programando com Programando com OpenGLOpenGL

Exemplo. Desenhando um círculo:

#define PI 3.1415926535898

GLfloat circle_points = 100;

glBegin(GL_LINE_LOOP);

for (i = 0; i < circle_points; i++) {

angle = 2*PI*i/circle_points;

glVertex2f(cos(angle), sin(angle));

}

glEnd();

Programando com Programando com OpenGLOpenGL

Tratamento de erros em OpenGL:Quando fazemos algo inválido em OpenGL ou GLU o programa não pára; apenas não faz o que a gente espera. Isso dificulta a depuração!Quando um erro ocorre um flag é setado com um código de erro. Para acessar esse código deve-se usar glGetError();Por outro lado… cada chamada OpenGL a mais afetam a performance… Em alguns casos quando queremos renderização em tempo real temos que eliminar o maior número possível dessas chamadas! Lembre-se: todos os comandos são bufferizados e processados.

Programando com Programando com OpenGLOpenGL

Matrizes:

Três tipos de matrizes:

GL_MODELVIEW:A matriz modelview controla as transformações dos vértices dos objetos da cena

GL_PROJECTIONA matriz de projeção controla como a cena 3-D éprojetada em 2-D

GL_TEXTUREA matriz de texturas (geralmente pouco conhecida e utilizada) transforma as coordenadas das textura para obter efeitos como projetar e deslocar texturas

Page 5: Introdu ção ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/cgr/IntroOpenGL.pdf2 Introdu ção Como funciona a OpenGL API Procedural. Programador invoca comandos OpenGL para

5

Programando com Programando com OpenGLOpenGL

Matrizes de projeção:glFrustum(left,right,bottom,top,near,far)

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

gluPerspective(fovy,aspect,zNear,zFar)

gluOrtho2D(left,right,bottom,top)

gluLookAt(eyex, eyey, eyez, centerx,

centery, centerz, upx, upy, upz)

Coordenadas de TelaglViewport(x, y, width, height)

Programando com Programando com OpenGLOpenGL

Transformações:Modelagem

glTranslate{fd}(x, y, z)

glRotate{fd) (angle, x, y, z )

glScale{fd}(x,y,z)

Propriedades Materiais glMaterial*()ambiente, difuso, especular

Fontes de Luz glLight*()cor, posição, atenuação, etc

Programando com Programando com OpenGLOpenGL

Exemplo:// Estabelece o modo de projeção

glMatrixMode(GL_PROJECTION);

// limpa matrizes

glLoadIdentity();

// especifica o Frustum

glFrustum(-1, 1, -1, 1, 0.0, 40.0);

// habilita estado de modelagem

glMatrixMode(GL_MODELVIEW);

// cria matriz de transformação

glPushMatrix();

// define uma transformação de rotação em X,Y,Z

glRotatef(45.0, 1.0, 1.0, 1.0);

render(); // invoca um método do programa

glPopMatrix();

Programando com Programando com OpenGLOpenGL

Dicas:Lembre-se que a origem do OpenGL é no canto esquerdo (e é baseado em um sistema de coordenadas left-hand )Lembre-se de (1) ativar o modo de preenchimento desejado (por ex.: glEnable(GL_DEPTH_TEST);) e de (2) Limpar os respectivos buffers! (por ex.: glClear(GL_COLOR_BUFFER_BIT |

GL_DEPTH_BUFFER_BIT);)Evitar mudanças constantes de estadoMaior freqüência de erros: posicionamento de câmera. Atente-se para olhar de um ponto e para um ponto que seja coerente com os objetos renderizados.

Programando com Programando com OpenGLOpenGL

Dicas:Ao manipular as matrizes OpenGL lembre-se de verificar se o tipo de matriz correto está ativado.Por exemplo:glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glFrustum(-1, 1, -1, 1, 0.0, 40.0);

/* glMatrixMode(GL_MODELVIEW); */

glPushMatrix();

glRotatef(45.0, 1.0, 1.0, 1.0);

render();

glPopMatrix();

Programando com Programando com OpenGLOpenGL

Alguns métodos normalmente presentes em programas OpenGL:

init() – inicializiação de variáveis e de estados permanentes.display() – é que a coisa acontece!! Desenho das primitivas e definição dos estados relacionados a elas, como cor, textura e outros aspectos.update() – alterações a serem realizadas quando do redimensionamento da janela.getInputs() – processamento de entradas como teclado e mouse.

Page 6: Introdu ção ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/cgr/IntroOpenGL.pdf2 Introdu ção Como funciona a OpenGL API Procedural. Programador invoca comandos OpenGL para

6

Programando com Programando com OpenGLOpenGL

Exemplos de código para o método init():void init(){

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(50.0, 1.0, -10.0, 7.0);

glEnable(GL_LIGHTING);

const float specularColor[] = {1.0f, 0.0f, 1.0f,

0.5f};

glLightfv(GL_LIGHT0, GL_SPECULAR,

specularColor);

}

Programando com Programando com OpenGLOpenGL

Exemplos de método update():

Programando com Programando com OpenGLOpenGL

Exemplos de método display():

Programando com Programando com OpenGLOpenGL

Exemplos de método getInputs():

OpenGLOpenGL

Fake or Real?

BibliografiasBibliografias

www.opengl.orgwww.khronos.orgOpenGL Programming Guide (Woo, Neider, Davis - Addison-Wesley )OpenGL Programming for the X WindowSystemOpenGL Game Programming (Astle, Hawkins, LaMothe)

Page 7: Introdu ção ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/cgr/IntroOpenGL.pdf2 Introdu ção Como funciona a OpenGL API Procedural. Programador invoca comandos OpenGL para

7

Referências bibliogrReferências bibliográáficasficas

WRIGHT Jr., Richard S.; LIPCHAK, Benjamin; HAEMEL, Nicholas. OpenGLSuperbible: Comprehensive Tutorial

and Reference. 4ed.: Addison-Wesley. 2007.Slides do prof. Dr. Christian Hofsetz.