Introdu o ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/pgr/OpenGL_intro.pdfIntrodu o Como...
Transcript of Introdu o ao OpenGL - Unisinosprofessor.unisinos.br/ltonietto/jed/pgr/OpenGL_intro.pdfIntrodu o Como...
Introdução ao OpenGL
Leandro ToniettoProcessamento Gráfico / Computação GráficaJogos [email protected]://www.inf.unisinos.br/~ltoniettoMar-2008
Alguns slides são provenientes da apresentação do professor Christian Hofsetz
quinta-feira, 10 de março de 2011
Sumário
IntroduçãoProgramando com OpenGLExemplos
quinta-feira, 10 de março de 2011
Introdução
O que é OpenGL? [1]Open Graphics LibraryInterface 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.
quinta-feira, 10 de março de 2011
Introduçã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.
quinta-feira, 10 de março de 2011
Introduçã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 4.0. Utilizaremos OpenGL na versão 2.0 da especificação.
quinta-feira, 10 de março de 2011
Introduçã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.
quinta-feira, 10 de março de 2011
Introdução
Como funciona a OpenGLAPI Procedural. Programador invoca comandos OpenGL para compor uma cena. OpenGL não renderiza uma cena descrita, ela deve ser “programada” em código.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 sombreamento, 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, SDL, ...)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.
quinta-feira, 10 de março de 2011
Introdução
Como funciona a OpenGL
Cor do fog
Luz
Brilho
Matriz
Largurada linha
Framebuffer
Erro
Cor atual
Textura
quinta-feira, 10 de março de 2011
Introduçã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 rápida
quinta-feira, 10 de março de 2011
Introduçã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.
quinta-feira, 10 de março de 2011
Modelo de Aplicação
Modelo da Aplicação
Aplicação
SistemaGráfico
Dados 2D/3DOpenGL/GLUT/SDL/DirectX
Manipula dados e define o que será desenhado e aonde.
quinta-feira, 10 de março de 2011
Modelo de Aplicação
Modelo da Aplicação
Aplicação
Dados 2D/3D
Manipula dados e define o que será desenhado e aonde.
GLUT
GLUT – sistema de janelas independente de sistema. Não é livre
quinta-feira, 10 de março de 2011
Modelo de Aplicação
Modelo da Aplicação
Aplicação
Dados 2D/3D
Manipula dados e define o que será desenhado e aonde.
SDL – Simple DirectMedia Layer. LGPL. É livre
quinta-feira, 10 de março de 2011
Programando com OpenGL
Bibliotecas OpenGLMicrosoft Windows opengl32.dll
OpenGL utility library (GLU) glu32.dllConjunto 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 OpenGL
glu.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
quinta-feira, 10 de março de 2011
Programando com OpenGL
Tipos de dados para se usar com a API OpenGL
quinta-feira, 10 de março de 2011
Programando com OpenGL
Convenção de nomes
glVertex3f(0.0f, 0.0f, 0.0f);glVertex3i(0, 0, 0);glVertex3v(vertex[0]);
quinta-feira, 10 de março de 2011
Programando com OpenGL
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
quinta-feira, 10 de março de 2011
Programando com OpenGL
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 não 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.
quinta-feira, 10 de março de 2011
Programando com OpenGL
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.
quinta-feira, 10 de março de 2011
Programando com OpenGL
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*()
quinta-feira, 10 de março de 2011
Programando com OpenGL
Primitivas:
Primitiva / Constante DescriçãoGL_POINTS Pontos individuaisGL_LINES Par de vértices = 1 linha
GL_LINE_STRIP Pontos conectados por linhasGL_LINE_LOOP = strip + 1 linha para fecharGL_TRIANGLES 3 pontos = 1 triângulo
GL_TRIANGLE_STRIP Série de triângulos conectadosGL_TRIANGLE_FAN Todos tri compartilham ponto zero
GL_QUADS 4 pontos = 1 quadriláteroGL_QUAD_STRIP Série de quads. conectadosGL_POLYGON Todos pontos = 1 polígono
quinta-feira, 10 de março de 2011
Programando com OpenGL
Primitivas:
quinta-feira, 10 de março de 2011
Programando com OpenGL
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();
quinta-feira, 10 de março de 2011
Programando com OpenGL
glColor3f(0.0f, 0.5f, 1.0f);glBegin(GL_POLYGON); glVertex…glEnd();
glColor(0.0f, 0.0f, 0.0f);glBegin(GL_LINE_LOOP); glVertex…glEnd();
24
quinta-feira, 10 de março de 2011
Programando com OpenGL
Tipos de polígonos:
Válidos Inválidos
quinta-feira, 10 de março de 2011
Programando com OpenGL
Objetos curvos são aproximados por retas:
quinta-feira, 10 de março de 2011
Programando com OpenGL
Exemplo. Desenhando um círculo:
#define PI 3.1415926535898
GLfloat circle_points = 100.0f;
GLfloat angle, raioX=1.0f, raioY=1.0f;
glBegin(GL_LINE_LOOP);
for (int i = 0; i < circle_points; i++) {
angle = 2*PI*i/circle_points;
glVertex2f(cos(angle)*raioX, sin(angle)*raioY);
}
glEnd();
Note que: • O tamanho do círculo é dado pelo raio, no exemplo é desenhado um
círculo com raio 1 • Definindo o valor dos raios X e Y com valores diferentes, pode-se
desenhar uma elipse.
quinta-feira, 10 de março de 2011
Programando com OpenGL
Modo de polígono:glPolygonMode(<lado>,<modo>)<lado>
GL_FRONT_AND_BACKGL_FRONTGL_BACK
<modo>GL_POINTGL_LINEGL_FILL
quinta-feira, 10 de março de 2011
Programando com OpenGL
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.
quinta-feira, 10 de março de 2011
Programando com OpenGL
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
quinta-feira, 10 de março de 2011
Programando com OpenGL
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)
quinta-feira, 10 de março de 2011
Programando com OpenGL
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
quinta-feira, 10 de março de 2011
Programando com OpenGL
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();
quinta-feira, 10 de março de 2011
Programando com OpenGL
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.
quinta-feira, 10 de março de 2011
Programando com OpenGL
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();
quinta-feira, 10 de março de 2011
Programando com OpenGL
Renderização de textos:OpenGL não dá nenhum suporte nativo para o tratamento textos e de fontes gráficas. Portanto, o texto não considerado uma “primitiva” ou algo do gênero para ser renderizado.Deve ser utilizado algum recurso de biblioteca para fazer esta tarefa.GLUT e SDL possuem métodos para suportar a renderização como uma imagem:
Exemplo GLUT://Para posicionar na coordenada (x,y)glRasterPos2f(x,y);//Chamada GLUT para escritaglutBitmapCharacter(fonte,*(texto++));
quinta-feira, 10 de março de 2011
Programando com OpenGL
Renderização de textos:Usado em fonte
GL_BITMAP_8_BY_13GL_BITMAP_9_BY_15GL_BITMAP_TIMES_ROMAN_10GL_BITMAP_TIMES_ROMAN_24GL_BITMAP_HELVETICA_10GL_BITMAP_HELVETICA_12GL_BITMAP_HELVETICA_18
quinta-feira, 10 de março de 2011
Programando com OpenGL
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.
quinta-feira, 10 de março de 2011
Programando com OpenGL
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);
glMatrixMode(GL_MODELVIEW);
}
quinta-feira, 10 de março de 2011
Programando com OpenGL
Exemplos de método update():
quinta-feira, 10 de março de 2011
Programando com OpenGL
Exemplos de método display():
quinta-feira, 10 de março de 2011
Programando com OpenGL
Exemplos de método getInputs():
quinta-feira, 10 de março de 2011
OpenGL
Fake or Real?
quinta-feira, 10 de março de 2011
Bibliografias
www.opengl.orgwww.khronos.orgOpenGL Programming Guide (Woo, Neider, Davis - Addison-Wesley )OpenGL Programming for the X Window SystemOpenGL Game Programming (Astle, Hawkins, LaMothe)
quinta-feira, 10 de março de 2011
Bibliografias
Red Bookhttp://fly.cc.fer.hr/~unreal/theredbook/
Tutorial de OpenGL (Português)http://www.ingleza.com.br/opengl/index.html
Referência (API) para PyOpenGLhttp://pyopengl.sourceforge.net/documentation/manual/
Documentação para PyOpenGLhttp://pyopengl.sourceforge.net/documentation/index.html
Referência (API) para wxPythonhttp://www.wxpython.org/onlinedocs.php
Tutorial básico de wxPythonhttp://www.wxpython.org/tutorial.php
quinta-feira, 10 de março de 2011
Referências bibliográficas
WRIGHT Jr., Richard S.; LIPCHAK, Benjamin; HAEMEL, Nicholas. OpenGL Superbible: Comprehensive Tutorial and Reference. 4ed.: Addison-Wesley. 2007.Slides do prof. Dr. Christian Hofsetz.Slides do prof. João Bittencourt
quinta-feira, 10 de março de 2011