FUNDAMENTOS E APLICAÇÕES. Luis Valente

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

Texturas. Aula 7. Sistemas Gráficos e Interactivos Instituto Superior de Engenharia do Porto. Paulo Gandra de Sousa

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?

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

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

OpenGL. Alberto B. Raposo

Computação Gráfica - 13

Computação Gráfica - OpenGl 02

Introdução a OpenGL. Renato Rodrigues Oliveira da Silva Danilo Medeiros Eler

Computação Gráfica - 13

OpenGL. Conceitos Básicos. Waldemar Celes. Tecgraf/PUC-Rio

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

CG 2013/2014 Primeiro Teste LEIC Alameda/Taguspark

LAB. 1. Introdução à OpenGL

Computação Gráfica. Texturas

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

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

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

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

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

OpenGL. Computação Gráfica ISEL/DEETC/SP Computação Gráfica

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

Introdução a Prática em OpenGL

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

Fundamentos de Computação Gráfica. Texturas

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

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

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

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

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

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

OpenGL. Soraia Musse

Visualização. - Aula 4 -

Computação Gráfica - 04

Computação Gráfica. Texturas

Fundamentos de Computação Gráfica

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

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

Introdução à Computação Gráfica Texturas

Mapeamento de Texturas

FCG2006 Prova sobre OpenGL e Rastreamento de Raios

COMPUTAÇÃO GRÁFICA - PROF. MSC. LEANDRO TONIETTO SELEÇÃO DE OBJETOS EM OPENGL - SELECT BUFFER

Projeções e Visualização

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

Engenharia Informática Computação Gráfica

Computação Gráfica OpenGl 03

OpenGL Conceitos Básicos

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

1-Introdução ao OpenGL

Mapeamento de Textura

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

INF01046 Fundamentos de Processamento de Imagens. Prof. Manuel M. Oliveira

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

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

Algoritmos de Recorte em 2D

Pipeline de Visualização 3D

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

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

ORIENTAÇÃO DA MONOGRAFIA: PROF. MARCELO F. PORTO COORDENAÇÃO DA DISCIPLINA: PROF.ª MAGALI MARIA DE ARAÚJO BARROSO

OpenGL Conceitos Avançados

Usando Display Gráfico com C18 e C30

Transformações geométricas no plano e no espaço

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

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

Desenvolvimento de aplicações tridimensionais com OpenGL

Manual de Apoio Luís Filipe Lobo

Programação 2009/2010 MEEC - MEAer Laboratório 5 Semana de 26 de outubro de 2009

Cenários 3D Interativos com Software Livre

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Prova - 23a de junho de 2008

Computação Gráfica. Introdução. Tomás A. C. Badan

Revisão C++ - Parte 1

Fundamentos de Computação Gráfica. Transformações Geométricas

CAPÍTULO II VISUALIZAÇÃO E APLICAÇÕES GRÁFICAS 2D 3 1- PONTOS E RETAS NO OPENGL 3. 2 TECLADO E MOUSE (Callbacks) 15 3 CURVAS PARAMÉTRICAS 20

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

Detalhes de Superfícies. Introdução à Computação Gráfica Texturas. Propriedades Mapeáveis. Mapeamento de Textura

Curso de C. Introdução by Arnaldo V. Moura e Daniel F. Ferber 3/10/ :43 AM

Sobre o Visual C

Sistemas Gráficos Interativos. Interações

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

PROGRAMA DE INTERFACE DE PRÉ E PÓS PROCESSAMENTO E LINK COM EXECUTÁVEL PARA ANÁLISE DE INSTABILIDADE DE TUBULAÇÕES FÁBIO PESSOA DA SILVA NUNES

Computação Gráfica. GLSL Programação de Shaders

Transcrição:

FUNDAMENTOS E APLICAÇÕES Luis Valente 1

DIÁRIO DE BORDO OpenGL Aplicações Usando OpenGL Sistema de Janelas Primitivas Cores e Sombreamento Transformações e Projeções Composição de Objetos Mapeamento de Texturas Objetos Complexos Exemplo Conclusões 2

INTRODUÇÃO O que é OpenGL? API para acesso a hardware gráfico Projetada para funcionar em vários Sistemas Operacionais O que OpenGL oferece Comandos para criação e manipulação de gráficos 3D Incluem especificação de geometria, efeitos especiais, transformações em sistemas de coordenadas, entre outros. O que OpenGL não oferece Características dependentes do Sistema Operacional Janelas (e processamento de eventos) Fontes Interação com o usuário etc 3

APLICAÇÕES Games Doom 3 4

APLICAÇÕES Games Call of Duty 2 5

OPENGL Componentes GL GLU Versão Atual 2.0 Contém os comandos principais da API Contém comandos utilitários Características Máquina de estados OpenGL mantém internamente variáveis que a configuração atual (estado) de certas propriedades (ex: cor atual) Existem comandos para habilitar/desabilitar e consulta/alteração de valores associados aos estados API de modo imediato Os comandos fornecidos afetam estados do OpenGL imediatamente 6

USANDO OPENGL Instalação Windows Já está pronto para uso, em modo software, no mínimo Aceleração por hardware disponível através de driver especializado Arquivos de inclusão (.h) #include <GL/gl.h> #include <GL/glu.h> Arquivos para ligação com DLL Visual C++ : opengl32.lib, glu32.lib Onde obter Grande parte dos compiladores C/C++ já vem com os arquivos.h e os arquivos de ligação correspondentes Versão: Pode variar Visual C++: 1.1 gcc: 1.3 7

USANDO OPENGL Comandos GL GLU Prefixo glu 8

USANDO OPENGL Tipos de dados Exemplos glcolor3f : glcolor3f (1.0f, 1.0f, 1.0f) glcolor3fv : GLfloat color [3]; glcolor3fv (color); 9

SISTEMAS DE JANELAS Problemas! OpenGL não oferece ferramentas relacionadas a sistemas de janelas! É preciso abrir uma janela para o programa Onde as operações de desenho são visualizadas Eventualmente, é preciso tratar eventos do sistema Mouse e teclado Interação com o usuário Eventos de redimensionamento da janela Etc... Soluções? freeglut (free gl utility toolkit) Biblioteca multiplataforma que oferece serviços relacionados a sistemas de janelas Código aberto Existem diversos outros toolkits 10

SISTEMAS DE JANELAS Exemplo #include <GL/freeglut.h> void OnDisplay () { glclearcolor (0.0f, 0.0f, 0.25f, 1.0f); } glclear (GL_COLOR_BUFFER_BIT); glflush (); int main (int argc, char * argv []) { glutinitdisplaymode (GLUT_SINGLE GLUT_RGB); glutcreatewindow ( Exemplo 1 ); glutdisplayfunc (OnDisplay); glutmainloop (); } return 0; 11

SISTEMAS DE JANELAS Alternativas ao freeglut Utilizar diretamente a API do Sistema Operacional SDL G3D CPW http://www.libsdl.org http://g3d-cpp.sourceforge.net/ http://www.mathies.com/cpw/ Existem várias outras disponíveis na rede http://www.opengl.org/resources/libraries/windowtoolkits.html 12

PRIMITIVAS 13

PRIMITIVAS Forma geral glbegin (nome);... glend (); Vértices em 3D glvertex* () Importante Ordenação dos vértices dos polígonos deve ser consistente Padrão: Sentido anti-horário É possível especificar a ordem glfrontface (ordem) GL_CW: Sentido horário GL_CCW: Sentido anti-horário 14

PRIMITIVAS Modos de Renderização Wireframe: Sólido: glpolygonmode (GL_FRONT, GL_LINE); glpolygonmode (GL_FRONT, GL_FILL); Pontos: glpolygonmode (GL_FRONT, GL_POINT); Outros valores para face: GL_BACK GL_FRONT_AND_BACK Backface Culling glenable (GL_CULL_FACE); Z-Buffer glenable (GL_DEPTH_TEST); 15

CORES E SOMBREAMENTO Cores podem ser especificadas por primitiva glcolor3f (1.0f, 0.0f, 0.0f); glbegin (GL_TRIANGLES); glvertex3f (0.0f, 10.0f, 5.0f); glvertex3f (-10.0f, 0.0f, 5.0f); glvertex3f (10.0f, 0.0f, 5.0f); glend (); Cores podem ser especificadas por vértice glbegin (GL_TRIANGLES); glcolor3f (1.0f, 0.0f, 0.0f); glvertex3f (0.0f, 10.0f, 5.0f); glcolor3f (0.0f, 1.0f, 0.0f); glvertex3f (-10.0f, 0.0f, 5.0f); glcolor3f (0.0f, 0.0f, 1.0f); glvertex3f (10.0f, 0.0f, 5.0f); glend (); 16

CORES E SOMBREAMENTO Qual é a diferença? Modos de sombreamento Flat shading: glshademodel (GL_FLAT); Shading suave: glshademodel (GL_SMOOTH); * 17

TRANSFORMAÇÕES E PROJEÇÕES Transformações Viewport Modelagem Projeções Ortográfica Perspectiva 18

TRANSFORMAÇÕES E PROJEÇÕES Viewport Determina a área de desenho na janela glviewport (origem_x, origem_y, largura, altura); Exemplo glviewport (0, 0, 150, 100); origem: canto inferior esquerdo 19

TRANSFORMAÇÕES E PROJEÇÕES Utilização de matrizes para projeções e posicionamento/orientação Matrizes de modelagem e projeção são independentes Apenas um tipo de matriz pode ser usado de cada vez glmatrixmode (GL_PROJECTION); glmatrixmode (GL_MODELVIEW); Operações com matrizes afetam o tipo de matriz corrente Rotação glrotatef (angulo, x, y, z); Translação Escala gltranslatef (x, y, z); glscalef (x, y, z); Reiniciar a matriz glloadidentity (); 20

TRANSFORMAÇÕES E PROJEÇÕES Exemplo Desenhar um triângulo em (10, 10) glmatrixmode (GL_MODELVIEW); glloadidentity (); gltranslatef (10, 10, 0); glbegin (GL_TRIANGLES); glvertex2f (0.0f, 10.0f); glvertex2f (-10.0f, 0.0f); glvertex2f (10.0f, 0.0f); glend (); Desenhar um triângulo, rotacionado de 20º em Z glmatrixmode (GL_MODELVIEW); glloadidentity (); glrotatef (20.0f, 0.0f, 0.0f, 1.0f); glbegin (GL_TRIANGLES); glvertex2f (0.0f, 10.0f); glvertex2f (-10.0f, 0.0f); glvertex2f (10.0f, 0.0f); glend (); 21

TRANSFORMAÇÕES E PROJEÇÕES Projeção Ortográfica glortho (left, right, top, bottom, near, far); 22

TRANSFORMAÇÕES E PROJEÇÕES Projeção em Perspectiva glfrustum (left, right, top, bottom, near, far); gluperspective (fovy, aspect_ratio, near, far); 23

TRANSFORMAÇÕES E PROJEÇÕES Projeção Ortográfica Construção de uma projeção sem distorção // largura e altura da viewport largura =... altura =... glmatrixmode (GL_PROJECTION); glloadidentity (); float proporcao = largura/altura; if (proporcao >= 1.0f) glortho (left * proporcao, right * proporcao, bottom, top, near, far); else glortho (left, right, bottom / proporcao, top / proporcao, near, far); glmatrixmode (GL_MODELVIEW); glloadidentity (); 24

TRANSFORMAÇÕES E PROJEÇÕES Câmera glulookat (pos_x, pos_y, pos_z, alvo_x, alvo_y, alvo_z, up_x, up_y, up_z); Hierarquia de transformações glloadidentity (); glpushmatrix (); gltranslatef (0.0f, 10.0f, 0.0f); desenharesfera (); glpopmatrix (); glpushmatrix (); gltranslatef (10.0f, 0.0f, 0.0f); desenharesfera (); glpopmatrix (); 25

TRANSFORMAÇÕES E PROJEÇÕES Outras Transformações Transformações personalizadas glloadmatrixf (m); glmultmatrixf (m); As matrizes são orientadas a coluna ( column major ) Exemplo Transformação com resultado equivalente a de gltranslatef void translate (GLfloat x, GLfloat y, GLfloat z) { GLfloat * m = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, x, y, z, 1.0f}; } glmultmatrixf (m); 26

COMPOSIÇÃO DE OBJETOS Display Lists Listas de comandos OpenGL pré-processados Como criar Gluint id_lista = glgenlists (1); glnewlist (id_lista, GL_COMPILE);... // comandos do OpenGL glendlist (); Alternativa: Compilar e executar conforme a lista é gerada GL_COMPILE_AND_EXECUTE 27

COMPOSIÇÃO DE OBJETOS Display Lists Como executar glcalllist (id_lista); Como desalocar gldeletelists (id_lista, 1); Importante Uma vez criada, a lista não pode ser modificada (mas pode ser substituída) Alguns comandos não podem ser incluídos nas listas (como glnewlist) 28

MAPEAMENTO DE TEXTURAS Passos necessários Habilitar o uso de texturas glenable (GL_TEXTURE_2D); Carregar uma imagem do disco ou construir uma proceduralmente Importante: As dimensões das texturas precisam ser potências de 2 (até o OpenGL 2.0)! Transferir os dados da imagem para o OpenGL Especificar coordenadas de textura para os vértices 29

MAPEAMENTO DE TEXTURAS Identificadores de texturas GLuint id; glgentextures (1, & id);... // uso gldeletetextures (1, & id); GLuint textures [5]; glgentextures (5, textures);... // uso gldeletetextures (5, textures); Seleção da textura para uso glbindtexture (GL_TEXTURE_2D, id); A partir deste comando, todas as operações sobre texturas fazem referência ou afetam a textura representada por id. 30

MAPEAMENTO DE TEXTURAS Transferindo uma imagem para o OpenGL glteximage2d (GL_TEXTURE_2D, nível de detalhe, número de componentes de cor, largura, altura, borda, formato, tipo de dados do array, array contendo os dados da imagem ); Nível de detalhe: Usualmente, é zero; outros valores são usados para especificar mipmaps (avançado) Número de componentes de cor: Número de valores de cores para cada pixel; ex: RGB = 3, RGBA = 4 Borda: Indica se a imagem possui borda; pode ser 0 ou 1 Formato: Indica o tipo de cor da imagem; ex: GL_RGBA, GL_RGB, GL_LUMINANCE, etc Tipo de dados do array: GL_UNSIGNED_BYTE, GL_FLOAT, etc. 31

MAPEAMENTO DE TEXTURAS Exemplo: Carregar uma imagem RGB de 64x64 do disco e transferí-la para o OpenGL unsigned int * buffer; GLuint id;... // aloca buffer para imagem e carrega imagem do disco glenable (GL_TEXTURE_2D); glgentextures (1, & id); glbindtexture (GL_TEXTURE_2D, id); glteximage2d (GL_TEXTURE_2D, 0, // nível de detalhe 3, // número de componentes de cor 64, // largura 64, // altura 0, // borda GL_RGB, // formato GL_UNSIGNED_BYTE // tipo de dados do array buffer // array contendo os dados da imagem ); 32

MAPEAMENTO DE TEXTURAS Especificar coordenadas de textura gltexcoord2f (s, t); Coordenadas de textura (s,t) variam de 0.0 a 1.0, inclusive O que acontece se os valores forem maiores do que 1.0? A textura é truncada (GL_CLAMP) A textura é repetida (GL_REPEAT) * Como especificar gltexparameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, modo); gltexparameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, modo); 33

MAPEAMENTO DE TEXTURAS Alguns outros parâmetros Filtro de redução (usado quando a textura é maior do que o polígono) gltextureparameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtro); Filtro de ampliação (usado quando a textura é menor do que o polígono) gltextureparameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtro); Alguns filtros disponíveis GL_NEAREST: Utiliza o texel mais próximo (vizinho) do pixel que está sendo mapeado; é o mais rápido porém o de menor qualidade GL_LINEAR * : Utiliza interpolação linear Modos de textura GL_MODULATE *: Interpola a textura com informações de iluminação e cor (modo padrão) GL_DECAL: Utiliza a textura ignorando informações de iluminação e cor dos polígonos gltexenvi (GL_TEXTURE_ENV, GL_TEXTURE_MODE, modo); 34

MAPEAMENTO DE TEXTURAS Exemplo: Desenhar um quadrado com mapeamento de textura glbindtexture (GL_TEXTURE_2D, id); glbegin (GL_QUADS); glcolor3f (1.0f, 1.0f, 1.0f); gltexcoord2f (0.0f, 0.0f); glvertex3f (-10.0f, -10.0f, 0.0f); gltexcoord2f (1.0f, 0.0f); glvertex3f (10.0f, -10.0f, 0.0f); gltexcoord2f (1.0f, 1.0f); glvertex3f (10.0f, 10.0f, 0.0f); gltexcoord2f (0.0f, 1.0f); glvertex3f (-10.0f, 10.0f, 0.0f); glend (); 35

ALÉM DE LINHAS E TRIÂNGULOS Quadrics Possibilitam o uso de objetos de nível mais alto, como esferas e cilindros Como criar GLUquadricObj * obj = glunewquadric ();... // uso gludeletequadric (obj); 36

ALÉM DE LINHAS E TRIÂNGULOS Parâmetros que podem ser modificados Estilo de desenho: gluquadricdrawstyle (obj, estilo) GLU_FILL: Sólido GLU_LINE: Wireframe GLU_SILHOUETTE: Contorno GLU_POINT: Somente os vértices Modo de geração de vetores normais: gluquadricnormals (obj, modo) GLU_NONE: Vetores normais não são gerados GLU_FLAT: Vetores são gerados para criar uma aparência facetada GLU_SMOOTH: Vetores são gerados para criar uma aparência suave Orientação dos vetores normais: gluquadricorientation (obj, orientação) Normais apontam para for a (GLU_OUTSIDE) ou para dentro (GLU_INSIDE) Indicar se coordenadas de textura devem ser geradas automaticamente: gluquadrictexture (obj, flag) Sim (GL_TRUE) ou não (GL_FALSE) 37

ALÉM DE LINHAS E TRIÂNGULOS O que pode ser desenhado Cilindros: glucylinder (obj,...) Discos: gludisk (obj,...) Discos parciais: glupartialdisk (obj,...) Esferas: glusphere (obj,...) 38

EXEMPLO Desenhar um quadrado e animá-lo dentro de um volume pré-definido #include <GL/freeglut.h> float quad_x = 0.0f; float quad_y = 0.0f; float vx = 0.01f; float vy = 0.005f; void OnUpdate (); void OnResize (int width, int height); void OnRender (); void OnKeyPress (unsigned char key, int x, int y); void InitGL (); void main () { glutinitdisplaymode (GLUT_DOUBLE GLUT_DEPTH GLUT_RGB); glutcreatewindow ( Exemplo 1 ); glutdisplayfunc (OnRender); glutreshapefunc (OnResize); glutkeyboardfunc (OnKeyPress); glutidlefunc (OnUpdate); InitGL (); } glutmainloop (); 39

EXEMPLO void OnUpdate () { quad_x += vx; quad_y += vy; if (quad_x > 10.0f quad_x < -10.0f) vx = - vx; if (quad_y > 10.0f quad_y < -10.0f) vy = - vy; } glutpostredisplay (); void OnResize (int width, int height) { glviewport (0, 0, width, height); glmatrixmode (GL_PROJECTION); glloadidentity (); glortho (-12.0f, 12.0f, -12.0f, 12.0f, -12.0f, 12.0f); } glmatrixmode (GL_MODELVIEW); glloadidentity (); 40

EXEMPLO void OnKeyPress (unsigned char key, int x, int y) { switch (key) { case 'q': case 'Q' : exit (0); break; } } void InitGL () { glenable (GL_DEPTH_TEST); glenable (GL_CULL_FACE); glclearcolor (0.0f, 0.0f, 0.0f, 1.0f); } glmatrixmode (GL_MODELVIEW); glloadidentity (); 41

EXEMPLO void OnRender () { glclear (GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT); glloadidentity (); } gltranslatef (quad_x, quad_y, 0.0f); glcolor3f (1.0f, 0.0f, 0.0f); glbegin (GL_QUADS); glend (); glvertex3f (2.0f, 2.0f, 0.0f); glvertex3f (-2.0f, 2.0f, 0.0f); glvertex3f (-2.0f, -2.0f, 0.0f); glvertex3f (2.0f, -2.0f, 0.0f); glutswapbuffers (); 42

CONCLUSÕES Existem muito mais coisas Isso foi só um aperitivo do que o OpenGL tem a oferecer Links Site oficial: http://www.opengl.org Minha página: http://www.ic.uff.br/~lvalente Tutoriais de OpenGL http://www.ic.uff.br/~lvalente/pt/opengl_tutor.html http://nehe.gamedev.net http://www.xmission.com/~nate/tutors.html 43