คอมพิวเตอร์กราฟิกส์ใช้ OpenGL (Computer Graphics using OpenGL)
Introdu ção ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/cgr/IntroOpenGL.pdf2 Introdu...
Transcript of Introdu ção ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/cgr/IntroOpenGL.pdf2 Introdu...
1
IntroduIntroduçção ao ão ao OpenGLOpenGL
Leandro Tonietto
Processamento Gráfico / Computação Gráfica
Jogos Digitais
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.
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]);
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:
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
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.
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)
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.