OpenGL – Uma abordagem prática e objetiva Última atualização: 16-nov-2008 1 - Introdução Computação Gráfica é uma área da Ciência da Computação que se dedica ao estudo e ao desenvolvimento de técnicas e algoritmos para geração, manipulação e análise de imagens pelo computador Introdução aplicações gráficas processamento gráfico Pipeline A palavra pipeline é usada para descrever um processo composto de duas ou mais etapas para geração de uma imagem Framebuffer framebuffer – memória do dispositivo gráfico 2 - Instalação No DEV-C++ <alt>+<P> --> abre o menu Projeto Selecionar Opções de Projeto Selecione a aba Parâmetros e em Linker verifique: -lglut32 -lopengl32 -lglu32 -lwinmm -lgdi32 3 – Primeiros passos em OpenGL Função Função Função Função Desenha Teclado Inicializa Principal Primeiros passos em OpenGL Veja exemplo em: http://www.novatec.com.br/livros/open gl/ 4 – Padronização dos Nomes das Funções e Tipos de Dados Funções - Exemplos void glColor(GLint red, GLint green, GLint blue); void glColor3d(GLdouble red, GLdouble green, GLdouble blue) Tipos de dados OpenGL Tipo de dado OpenGL Representação interna Tipo de dado C equivalente Sufixo GLbyte int 8 bits signed char b GLshort int 16 bits short s GLint, GLsizei int 32 bits int ou long i GLfloat, GLclampf ponto flutuante – 32 bits float f GLdouble, GLclampd ponto flutuante – 64 bits double d GLubyte, GLBoolean int 8 bits sem sinal unsigned char ub GLushort int 16 bits sem sinal unsigned short us GLuint, GLemun, GLbitfield int 32 bits sem sinal unsigned long ou unsigned int ui 5 – GLUT – GL Utility Toolkit Responsável pelo gerenciamento de janelas e tratamento de eventos GLUT - Funções // Especifica a posição inicial da janela GLUT glutInitWindowPosition(int x, int y); // Especifica o tamanho inicial em pixels da janela GLUT glutInitWindowSize(int largura, int altura); Criação da Janela // Cria a janela passando como argumento o título da mesma glutCreateWindow(char *string); Funções para tratamento de eventos glutDisplayFunc glutReshapeFunc glutKeyboardFunc glutSpecialFunc glutMouseFunc glutMotionFunc glutPassiveMotionFunc glutIdleFunc 6 – Máquinas de Estado Uma máquina de estados corresponde a um dispositivo ou sistema que guarda o estado de um ou mais elementos em um momento específico Comandos de entrada são utilizados para alterar este estado e/ou gerar uma função de saída Máquina de estados OpenGL é considerado uma máquina de estados É composto de várias variáveis de estado que armazenam determinado valor e podem ser alteradas pela chamada a uma função Cada variável de estado possui um valor padrão (default) que pode ser alterado Funções para alteração de estado void glEnable(GLenum cap) void glDisable(GLenum cap) GLBoolean glIsEnabled(GLenum cap) --> verifica o estado que se encontra uma propriedade Variáveis de estado Variáveis de estado relacionadas são agrupadas em um atributo void glPushAttrib(GLbitfield mask) void glPopAttrib(void) 7 – Definição do Espaço de Trabalho modelo coordenadas geométricas sistema de referencia Sistema de Referência do Universo (SRU) Sistema de Referência da Tela (SRT) Definições Modelo-> é uma representação computacional de um objeto, isto é, corresponde a uma estrutura de dados que tem sua descrição geométrica Imagem -> matriz de pontos Universo -> é a região do plano (ou do espaço) utilizada em uma aplicação Definições coordenadas geométricas sistema de referência -> define uma origem em relação a qual todos os posicionamentos do universo são descritos. 7.1 Visualização Bidimensional Sistema de Referencia do Universo Sistema de Referência do Universo (SRU) -> consiste em um plano cartesiano com dois eixos (x e y) perpendiculares entre si e que se cruzam na origem Sistema de Referência da Tela Sistema de Referência da Tela (SRT) -> no SRT a origem fica no canto superior esquerdo do monitor Definições modelos são criados independentes do dispositivo windows ou janela de seleção --> é a área do universo que delimita a região de interesse do usuário em um dado instante viewport ou janela de exibição --> define a área do monitor onde desejamos exibir o conteúdo da window Mapeamento SRU --> SRT Funções de conversão SRU para SRT void glViewport( GLint x, GLint y, GLsizei largura, GLsizei altura); void gluOrtho2d( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top) 7.2 Visualização Tridimensional Câmera Sintética Projeção Funções OpenGL Visualização Tridimensional Quando se trabalha em três dimensões, o SRU (Sistema de Referência do Universo) passa a ser composto por três eixos ortogonais entre si (x, y e z) e pela origem (0.0, 0.0, 0.0) Visualização Tridimensional Projeção: é a operação de obter representações bidimensionais de objetos tridimensionais Raios de projeção (segmentos de reta) chamados projetantes Plano de projeção Projeções Geométricas Planares Projeção Paralela Ortográfica --> as projetantes são paralelas entre si, passam pelos pontos qeu definem os objetos e interseccionam o plano com um ângulo de 90º Projeção Perspectiva --> as projetantes emanam de um único ponto que está a uma distancia finita do plano de projeção e passam pelos pontos que definem um objeto Funções OpenGL void gluLookAt() --> permite especificar a posição e a orientação da câmera sintética ou observador virtual void gluPerspective() --> utilizada para estabelecer a projeção perspectiva void glOrtho() --> função utilizada para estabelecer projeção ortográfica Funções OpenGL void glLoadIdentity(void) --> função utilizada para inicializar o sistema de coordenadas (carrega a matriz identidade) void glMatrixMode(GLenum mode) --> permite selecionar com qual matriz será trabalhado GL_MODELVIEW --> seleciona a matriz do modelo (de modelagem e transformação) GL_PROJECTION --> seleciona a matriz de projeção GL_TEXTURE --> seleciona a matriz de textura Funções GLUT void glutWireCube(GLdouble tamanho) --> função da biblioteca GLUT responsável pelo traçado de um cubo 8 – Desenhos bidimensionais 8.1 Primitivas Gráficas 8.2 Cores e Estilos de Traçados de Primitivas 8.3 Exibição de Texto 8.4 Desenhos de Curvas Paramétricas 8.1 - Primitivas Gráficas Primitivas gráficas consistem nos elementos básicos que compõem um desenho, tais como pontos, segmentos de reta e círculos Primitivas Gráficas vértices objetos cenas modelos Desenho de primitivas glBegin(<argumento>); // lista de vértices glEnd(); onde <argumento>determina qual objeto será desenhado Primitivas Gráficas em OpenGL (valores usados em <argumento>) GL_POINTS – desenha pontos GL_LINES – desenha linhas GL_LINE_STRIP – desenha segmentos de linhas conectados GL_LINE_LOOP – desenha segmentos de linhas conectados, unindo o primeiro ao último GL_POLYGON – desenha um polígono GL_TRIANGLES – desenha um triângulo GL_TRIANGLES_STRIP – desenha um triângulos conectados GL_TRIANGLES_FAN – desenha triângulos a partir de um ponto central GL_QUADS – desenha quadriláteros GL_QUADS_STRIP – desenha quadriláteros conectados Exemplos glBegin(GL_LINES); glVertex2f(12.0f, 12.0f); glVertex2f(100.5f, 100.5f); glEnd(); Desenha uma linha entre os dois vértices 8.2 Cores e Estilos de Traçado de Primitivas Primitivas podem ser desenhadas com diversas aparências como: cores, estilos e padrões diferentes Exemplo de Funções Alteração do tamanho dos pontos void glPointSize(GLfloat tamanho) Linhas: alteração de cor, espessura e estilo void glLineWidth(GLfloat largura) 8.3 Exibição de Texto Não suportado diretamente pela OpenGL, porém suportado pela GLUT Suporta dois tipos de fontes de caracteres: strokes (segmentos de reta) -->mais flexíveis (podem ser escaladas e rotacionadas) bitmap (formando por imagens que representam caracteres) --> mais rápidas para serem exibidas Caracteres – bitmap void glutBitmapCharacter(void *font, int character), onde: font: define o tamanho da fonte caracter: define o caracter Constantes para tipos de fontes GLUT_BITMAP_8_BY_13 GLUT_BITMAP_9_BY_15 GLUT_BITMAP_TIMES_ROMAN_10 GLUT_BITMAP_TIMES_ROMAN_24 GLUT_BITMAP_HELVETICA_10 GLUT_BITMAP_HELVETICA_12 GLUT_BITMAP_HELVETICA_18 Posicionamento void glRasterPos2f(x,y) Exibição de caracteres usando font stroke void glutStrokeCharacter(void *font, int caracter), onde font: define o nome da fonte (GLUT_STROKE_ROMAN e GLUT_STROKE_MONO_ROMAN) caractere: define o código ASCII do caractere a ser exibido 9 – Transformações Geométricas Translação Escala Rotação Translação void glTranslate(GLfloat tx, GLfloat ty, GLfloat tz) Escala void glScale(GLfloat ex, GLfloat ey, GLfloat ez) Rotação void glRotate(GLfloat ângulo, GLfloat x, GLfloat y, GLfloat z) onde: ângulo: é o ângulo de rotação Obs: no caso de rotação em 2D, a rotação é sempre feita em torno do eixo z (usar (0,0,1) para (x,y,z) respectivamente) Rotação ângulo positivo --> rotação feita no sentido anti-horário ângulo negativo --> rotação feita no sentido horário Matriz de Transformação matrizes com coordenadas homogêneas matriz de transformação corrente glLoadIdentity --> faz com que a matriz de transformação corrente seja inicializada com a matriz identidade, indicando que nenhuma transformação foi aplicada glMatrixMode com parâmetro GL_MODELVIEW Escopo das Transformações pilha de matrizes de transformação void glPushMatrix(void) void glPopMatrix(void) 10 - Animação Introdução Animação em 2D Animação em 3D Conceitos básicos animação tradicional animação por computador taxa de exibição de imagens (frame rate) Use de dois buffers glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB) glutSwapBuffers --> troca os buffers de exibição e desenho Animação em 2D void glutTimerFunc(unsigned int msecs, void (*func)(int value), int value) // Registra a função callback que será chamada a cada intervalo de tempo glutTimerFunc(150, Anima, 1) void Anima(int value) { ... glutPostRedisplay(); glutTimerFunc(150, Anima, 1); } 11 – Operações de Zoom e Pan 12 – Imagens em OpenGL 13 – Desenhos Tridimensionais Primitivas Gráficas de 3D Objetos Predefinidos da GLUT Carregando e Desenhando Objetos Desenhando Superfícies Paramétricas 14 - Realismo Conceitos fonte de luz idéia de iluminação Conceitos wireframe sólidos faces frontais faces traseiras objetos oclusos GL_CULL_FACE variável de estado: GL_CULL_FACE Objetos objetos convexos: objetos não-convexos (côncavos) exemplos: cubos, cilindros, esferas, cones exemplos: torus (toróide) algoritmo de remoção de faces Z-Buffer z-buffer -> algoritmo de remoção de superfícies escondidas Fontes de Luz Um modelo de iluminação em Computação Gráfica define a natureza da luz que emana de uma fonte e sua interação com todos os objetos de uma cena. A natureza da luz diz respeito à fontes de luz utilizada. Geralmente, três tipos de fontes de luz podem ser incluídas em uma cena 3D: pontual, direcional e spot. Fontes de Luz fonte de luz pontual: fonte de luz direcional: fonte de luz tipo spot: Modelos de Reflexão luz ambiente reflexão difusa reflexão especula Modelos de Tonalização (shading) Modelos flat shading modelo de Gouraud 14.4 Vetores Normais Um vetor normal a uma face, ou superfície, é um vetor perpendicular a essa face. vetor unitário produto vetorial Vetor Normal void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) 14.5 Descrição de Cores 14.5.1 Conceitos Descrição das cores A cor é um fenômeno "psicofísico", que depende da presença de luz no ambiente: se não há luz, não é possível enxergar cores percepção de cor depende da física da luz – considerada energia eletromagnética – e sua interação com os materiais físicos interpretação do fenômeno resultante pelo sistema visual humano Conceitos raio de luz: Sistema Visual Humano faixa visível do espectro eletromagnético (380 a 750 nm) luz monocromática luz cromática (colorida) Sistema Visual Humano Na retina existem os: cones – são sensíveis a energia em todo espectro visível azuis verdes vermelhos bastonetes – são sensíveis a intensidade luminosa Sistema Visual sensação de cor espaço de representação de cores tridimensional modelos de cor YIQ (padrão NTSC) YUV CMY (Cyan, Magenta e Yellow) RGB (Red, Green, Blue) 14.5.2 Funções OpenGL O modelo de cor adotado em OpenGL é o RGB ou RGBA (alpha – utilizado quando se está trabalhando com blending – o alpha especifica a opacidade) Modelo de cores color buffer 24 bits por pixel ( 8 bits para R, G e B ) tabela de cores (look-up table) Funções OpenGL void glClear(GL_COLOR_BUFFER_BIT) Limpa o conteúdo do framebuffer void glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) Especifica a cor usada por glClear (a cor default é (0.0, 0.0, 0.0) – preta) Funções OpenGL void glColor3f( GLfloat red, GLfloat green, GLfloat blue) 14.6 Uso de Múltiplas Fontes de Luz 14.7 Materiais 14.8 Sala 3D 15 – Blending (mistura) alpha – utilizado quando se está trabalhando com blending – o alpha especifica a opacidade 1.0 – cor totalmente opaca 0.0 – cor é totalmente transparente 15.1 Funções de Mistura Transparência Efeitos Atmosféricos função neblina Suavização de Linhas e Polígonos aliasing 16 – Mapeamento de Texturas Texturas Unidimensionais Texturas Bidimensionais 17 – Técnicas para Otimização do Rendering 18 - Buffers Um buffer em OpenGL nada mais pe do que uma área de memória onde é armazenada uma matriz de valores, que, por sua vez correspondem aos pixels de uma imagem Buffers - Tipos Color Buffer (ou buffer de cor) --> responsável por armazenar informações de cor (RGBA) para cada pixel Depth Buffer (ou buffer de profundidade ou zbuffer) --> armazena a distância de cada pixel ao observador Stencil Buffer (ou buffer de estêncil) --> fornecem opções para restringir ou bloquear o desenho na tela, de acordo com certas condições. Accumulation Buffer (ou buffer de acumulação) -> pode ser visto como um buffer de cor com maior precisão, em que é possível combinar várias imagens em uma só, de várias formas diferentes Função glutInitDisplayMode void glutInitDisplayMode(unsigned int mode) onde mode: GLUT_RGB, GLUT_RGBA ou GLUT_INDEX para o modelo de cor; GLUT_SINGLE ou GLUT_DOUBLE para utilização de um ou dois buffers; GLUT_ACUM, GLUT_ALPHA, GLUT_DEPTH, GLUT_STENCIL, GLUT_MULTISAMPLE, GLUT_STEREO, GLUT_LUMINANCE Função glutInitDisplayMode Especifica o modelo de cor, a utilização de single ou double-buffer e quais buffers OpenGL serão utilizados na janela GLUT que será aberta. Funções para inicialização de buffers void glClear(GLbitfield mask) --> função para limpar os buffers cujos identificadores são passados como parâmetros mask GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT GL_STENCIL_BUFFER_BIT GL_ACCUM_BUFFER_BIT 18.2 Color Buffer GL_COLOR_BUFFER_BIT Função glClearColor void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) --> especifica qual cor será usada para limpar o color buffer 18.3 Depth Buffer GL_DEPTH_BUFFER_BIT void glClearDepth(GLclampf depth), onde depth (profundidade) varia de 0.0 (mín) a 1.0 (máx) 18.4 Stencil Buffer GL_STENCIL_BUFFER_BIT 18.5 Accumulation Buffer GL_ACCUM_BUFFER_BIT 19 – Seleção de Objetos Considerações Iniciais Modo de Seleção Modo de Feedback Introdução Seleção de objetos Modo de Seleção void glSelectBuffer(GLsizei size, GLuint *buffer) pilha de nomes GLint glRenderMode(GLenum mode) onde mode: GL_RENDER, GL_SELECT ou GL_FEEDBACK Modo de Seleção void glInitNames(void) void glPushName(GLuint name) Modo de feedback void glFeedbackBuffer(GLSizei size, GLenum type, GLfloat *buffer), onde: size: indica o tamanho do vetor type: informa o tipo da informação desejada buffer: aponta ao inicio do vetor 20 – OpenGL e Outras linguagens de Programação C++ Java C# Python 21 – Programação de Shaders OpenGL Shading Language Apêndice A – Guia Rápido de Referência A.1 A.2 A.3 A.4 A.5 A.6 A.7 A.8 A.9 Apêndice A – Guia Rápido de Referência A.10 A.11 A.12 A.13 A.14 A.15 A.16 A.17 A.18 Apêndice B – Biblioteca de Estruturas e Funções Auxiliares B.1 B.2 B.3 B.4 B.5 A.1 Funções GLUT de Inicialização Apêndice B – Biblioteca de Estruturas e Funções Auxiliares B.6 B.7 B.8 B.9