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