Adônis Tavares Gustavo Ferraz Hugo Simões Humberto Pacheco Leandro Reinaux Nivan Ferreira Rodrigo Mateus Agenda • O que é OpenGL • Porque OpenGL foi criado • História • Utilização no mercado • Características de OpenGL • Pipeline • Bibliotecas • Análise de Competidores O que é OpenGL? Open Graphics Library É a especificação de uma API para programação em computação gráfica. Em outras palavras, OpenGL define um conjunto de funções fazer aplicações em computação gráfica. O que não é OpenGL? Não é uma linguagem de programação Não tem comandos para criação e gerenciamento de janelas lidar com entradas do usuário Não tem comandos de alto-nível para descrição de objetos 3D Porque OpenGL foi criado? Desenvolver aplicativos gráficos era difícil Falta de padronização Esforços duplicados Era necessário uma plataforma Abstração de hardware Portável Fácil de usar História PHIGS – anos 80 IRIS GL – final dos anos 80 pela SGI OpenGL é criado em 1992 – mantido pela OpenGL ARB (Architecture Review Board) • Evans&Sutherland HP IBM Intel Matrox NVIDIA Sun Silicon Graphics (SGI) Atualmente, parte do Khronos Group História OpenGL 2.0 3DLabs OpenGL Shading Language OpenGL 2.1 OpenGL Shading Language revision 1.20 sRGB texture formats OpenGL 3.0 Criação de objetos assíncrona Utilizações no mercado Ferramentas CAD IBM/Dassault CATIA Moonlight Creator (GPL) Modelagem e Desenho NewTek LightWave 3D Visualização e Simulação Interface com o Usuário Hardware-Assisted Rendering glutrad (radiosity, hemicube approximation) Animação e Efeitos Especiais Vídeo do trem do filme “The Prototype” Jogos Doom 3 Call of Duty Quake 3 NeverWinter Nights Características Tipo OpenGL Representão Interna Tipo em C equivalente Sufixo GLbyte 8-bit integer signed char b GLint, GLsizei 32-bit integer int ou long i GLfloat, GLclampf 32-bit floatingpoint float f GLdouble, GLclampd 64-bit floatingpoint double d GLubyte, GLboolean 8-bit unsigned integer unsigned char ub GLushort 16-bit unsigned integer unsigned short us GLuint, GLenum, GLbitfield 32-bit unsigned integer unsigned long ou unsigned int ui Primitivas Geométricas de OpenGL • Todas primitivas geométricas são especificadas por vértices GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_POLYGON GL_TRIANGLES GL_TRIANGLE_STRIP GL_QUADS GL_QUAD_STRIP GL_TRIANGLE_FAN Uma aplicação OpenGL é uma MEF Uma aplicação OpenGL é uma máquina de estados. A cor corrente é uma variável de estado. Há muitas outras! Todas as variáveis de estado possuem valores default O efeito de muitas delas pode ser habilitado e desabilitado Forma geral das instruções De forma geral: gl{nome da função}{número de argumentos}{tipo dos argumentos} (lista de argumentos); Nome da Função Exemplos: Número de argumentos glColor3f => gl Color 3 f Tipo dos argumentos Nome da função Tipo dos argumentos(float vector) glLightfv => gl Light fv Forma das instruções Infelizmente, nem todas as funções seguem fielmente esse padrão: glFlush() ,não recebe argumentos. glClearColor(), só recebe um tipo de argumento. Conclusão: Usar funções em OpenGL é fácil! Forma geral de um programa OpenGL Funções presentes em todo programa OpenGL: main(): - Ponto de início da execução; - Inicializa a janela e aspectos da geração de imagens(número de buffers de armazenamento e sistema de representação de cores); - Especifica a função callback de desenho. Forma geral de um programa OpenGL – void setupRC(void): » Inicializa aspectos de rendering(cor de desenho atual e cor de funto); – void renderScene(void): » Função executada sempre que for necessário exibir a imagem. • Podem existir outras funções callback – Funções que detectam eventos de teclado e mouse. Alguns exemplos Resultado #include <whateverYouNeed.h> main() { InitializeAWindowPlease(); glClearColor (0.0, 0.0, 0.0, 0.0); glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); glBegin(GL_POLYGON); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.25, 0.75, 0.0); glEnd(); glFlush(); UpdateTheWindowAndCheckForEvent s(); } Entendendo as funções básicas glClearColor(r,g,b,a): Especifica cor utilizada para limpar a tela(o valor a é utilizado em efeitos como transparência); glClear(buffer): Limpa um ou mais buffer’s, no exemplo GL_COLOR_BUFFER_BIT(onde a imagem está armazenada internamente); glColor3f(r,g,b): Determina a cor que será utilizada para o desenho(linhas e preenchimento); glOrtho: Entendendo as funções básicas glBegin(Const)...glEnd(): Conjunto utilizado para desenhar formas Const=GL_POLYGON. glVertex3f: Especifica os vétices do objeto que será desenhado glFlush: Força a execução de comandos ainda não executados acontecer. Pipeline Display Lists Comandos OpenGL armazenados para serem executados depois Comandos executados na ordem em que foram emitidos Aumenta a performance Redesenhar geometria ou mudar de estados várias vezes Vertex Operation Vértices e coordenadas normal transformadas por GL_MODELVIEW Pode ser demorada Coordenadas da textura são geradas e transformadas O cálculo da iluminação atualiza a cor do vértice Primitive Assembly Primitivas transformadas pela matriz de projeção e recortadas pelo volume de visualização Divisão perspectiva por w Viewport e depth (coordenada z) Culling test Primitivas geométricas completas Pixel Transfer Operation Scaling, bias, mapping e clamping Pixels da memória do sistema Armazenados na memória de textura ou enviados para a rasterização Pixels do frame buffer Retornam para um array na memória do sistema Texture Memory Imagens de textura são carregadas na memória de textura e aplicadas aos objetos geométricos Acelera a performance de texturas Texturas aumentam o realismo dos objetos Rasterization Dados geométricos e pixels em fragmentos Fragmentos: arrays retangulares contendo cor, depth, line width, point size e cálculos antialiasing (GL_POINT_SMOOTH, GL_LINE_SMOOTH, GL_POLYGON_SMOOTH) Pixels do interior do polígono são preenchidos (GL_FILL) Cada fragmento corresponde a um pixel no frame buffer Fragment Operation Série de operações que podem alterar ou descartar fragmentos Texture element generation Fog calculations Fragment Tests: ○ Scissor test -> glScissor() ○ Alpha test -> glAlphaFunc() ○ Stencil test -> glStencilFunc(), glStencilOp() ○ Depth test -> glDepthFunc() Blending, Dithering, Logical Operation, Masking (Bitmask) Feedback glGet*(), glIsEnabled(): informações e estados atuais glReadPixels(): dados dos pixels do frame buffer glRenderMode(GL_FEEDBACK): dados completos dos vértices transformados glCopyPixels(): copia os dados do pixel para outro frame buffer Resumo Visual Transformações Composição de matrizes: glMatrixMode(), glLoadIdenty, glPushMatrix(), glPopMatrix(), Projeção Ajusta a lente da câmera virtual Visualização Definem posição e orientação do volume de visualização (frustum) no universo Modelagem Movem os objetos Viewport Modificam a janela de visualização Iluminação e sombreamento Modelos simples com realismo – eficiência Modelo de iluminação de Phong Não modela sombras, reflexão direta e indireta, refração Fontes de Luz Considerada pontual Intensidade constante Representada por um valor RGB Componentes Ambiente (GL_AMBIENT) Difusa (GL_DIFFUSE) Especular (GL_SPECULAR) glLight() Tipos de Luz Pontual Raios emanam uniformemente em todas as direções Direcional Raios apenas em uma direção SpotLight Raios emitidos na forma de um cone apontando para uma determinada direção Material Cor depende da porcentagem de luz vermelha, verde e azul incidente que ele reflete Componentes Ambiente, Difusa, Especular, Emissiva glMaterial() Iluminação Local Dois modelos: Flat Shading Gouraud Shading Flat Shading Não apresenta variações ao longo do polígono. Com a normal de cada vértice é obtida a normal do polígono. glShadeModel (GL_FLAT); Gouraud Shading Apresenta variações de cor no polígono. Calcular a intensidade nos vértices, Interpolação destas intensidades glShadeModel (GL_SMOOTH); Bibliotecas Biblioteca Padrão OpenGL32 em Windows GL em unix/linux (libGL.a) Opengl Utility library (GLU) Ligação com Sistema de Janelas GLX para X Windows System, WGL para Windows, CGL para Macintosh Multi-plataforma: GLUT, GLUI, SDL, FLTK, QT, ... Bibliotecas Opengl Utility library (GLU) Funções de desenho de alto nível desenvolvidas com base nas funções primitivas de OpenGL. Normalmente é obtida junto com o OpenGL no mesmo pacote. Mipmaps, desenho de superfícies quádricas, NURBS Ex: gluOrtho2D(); Bibliotecas Opengl Utility Toolkit (GLUT) Interface com o sistema de janelas de qualquer ambiente Provê meios para construir interfaces gráficas como menus pop-up e suporte para dispositivos de entrada (teclado, mouse, joystick, trackball) Eventos (Event Callback Function) Bibliotecas OpenGL User Interface Library (GLUI) Baseada em GLUT Independente de ambiente Adição de buttons, checkboxes, radio buttons, and spinners Extremamente fácil de se utilizar Organização do Software Análise de competidores Cg: C for Graphics Desenvolvido pela NVIDIA em 2002. Baseada na linguagem C. Usada para gerar gráfico em tempo real em GPU programáveis. Não dá suporte a superfícies e a iluminação (Como o OpenGL). Análise de competidores VRML: Virtual Reality Modeling Language Usada para descrever mundos interativos 3D na Internet. Desenvolvida pela SGI (Silicon Graphics Inc) em 1995. Unificar e padronizar a tecnologia Web para gerar mundos 3D. Análise de competidores Direct3D (componente do DirectX) É utilizada na plataforma Windows. Consoles Xbox e o Dreamcast possui versão embarcada do Direct3D. Linguagem de alto nível de modelagem 3D. Possui os mesmos objetivos do OpenGL Análise de competidores Feature OpenGL 1.2 Core Direct3D 7 Direct3D 8 Operating System Support Windows (9x, NT, 2000), MacOS, others Windows (9x, 2000, CE) Windows (9x, 2000) API Definition Control OpenGL ARB Microsoft Microsoft API Specification OpenGL Specification SDK/DDK Documentation and DDK Reference SDK Documentation API Mechanism includes and libraries COM COM Software Emulation of Unaccelerated Features Yes No No Extension Mechanism Yes No Yes Source Implementation Available Yes System Mechanics Yes No Fonte: http://www.xmission.com/~legalize/d3d-vs-opengl.html Documentação • OpenGL Programming Guide (Woo, Neider, Davis Addison-Wesley ) • Interactive Computer Graphics: A Top-Down Approach with OpenGL (E. Angel - Addison-Wesley) Documentação • OpenGL Extensions Guide (Eric Lengyel) • Opengl Shading Language (Randi J. Rost) Documentação • OpenGL Programming for the X Window System • OpenGL Game Programming (Astle, Hawkins, LaMothe) Agradecimentos Professor Marcelo Walter que nos forneceu material e esclareceu dúvidas. Felipe Maia (ex-monitor de PG) que indicou várias fontes onde poderíamos conseguir exemplos interessantes. Referências OpenGL Programming Guide (Woo, Neider, Davis - AddisonWesley ) http://www.humus.ca/index.php?page=News http://www.soe.ucsc.edu/classes/cmps203/Fall04/finalreports/ ProjectPaper_JerryYee.pdf http://tools.devshed.com/c/a/Web-Development/OpenGL-vsDirectX-A-Comparison/ http://en.wikipedia.org/wiki/Comparison_of_OpenGL_and_Dir ect3D http://www.xmission.com/~legalize/d3d-vs-opengl.html http://www.inf.pucrs.br/~manssour/OpenGL/ http://www.songho.ca/opengl/gl_pipeline.html http://www.cgl.uwaterloo.ca/~vtluu/Talks/OpenGL/ http://www.inf.ufrgs.br/~nedel/inf01047/05-openGL.pdf