www.cin.ufpe.br/~vhr/opengl Luiz Fernando Marcio Neves Petrônio Gomes Thiago Monteiro Victor Hazin Roteiro O que é OpenGL? O Pipeline de Renderização O que é GLUT? Formato dos Comandos em OpenGL Primitivas Geométricas Visualização Cores Transformações Geométricas Iluminação Configurando OpenGL e GLUT Textura Referências O que é OpenGL ? A OpenGL é uma máquina de estados porque é possível colocá-la em vários estados (ou modos) que não são alterados, a menos que uma função seja chamada para isso. Muitas delas referem-se a modos que podem ser ativados ou desativados com os comandos glEnable() e glDisable(). O Pipeline de Renderização O que é GLUT ? OpenGL Utility Toolkit Sistema de Janelas independente de plataforma para desenvolvimento de aplicações OpenGL Possui funções para: Criar/Destruir janelas Tratar entradas de teclado, mouse e joysticks Baseado em funções de callback para tratamento de eventos API simples, não possuindo recursos diretos para criação de GUI's Independente do sistema de janelas nativo Programação orientada a eventos Formato dos Comandos em OpenGL Primitivas Geométricas OpenGL possui 10 primitivas geométricas um tipo de ponto três tipos de linhas seis tipos de polígonos Os vértices são definidos pelo comando Vertex glVertex2f( float x, float y); //vértice para um eixo 2D glVertex3d(double x,double y, double z); //vértice para um exixo 3D As primitivas precisam ser delimitadas através de Begin ... End conforme abaixo: Begin ( nome da primitiva); ... // aqui serão colocados comandos Vertex. End (void); Primitivas Geométricas Ponto a primitiva responsável em desenhar pontos na tela é GL_POINTS O código no exemplo abaixo desenha 3 pontos na tela. Cada vértice torna-se um ponto glBegin( GL_POINTS ); glVertex2f( xf, yf); glVertex2f( xf, yf); glVertex2f( xf, yf); glEnd(); Primitivas Geométricas Linhas GL_LINES : O terceira coordenada ( z ) é ignorada pois a linha é formada por dois vértices. Se houvesse um quarto vértice, uma nova linha entre o terceiro e quarto vértice seria exibida GL_LINE_STRIP: cria linhas consecutivas, ligando o primeiro vértice com o segundo, o segundo com o terceiro e assim por diante GL_LINE_LOOP : Funciona de maneira semelhante ao anterior, porém o último vértice é ligado a primeira, devido a isso o LOOP no seu nome. O espessura de uma linha pode ser modificada através do comando glLineWidth (GLint espessura), bastando passar como parâmetro a espessura da linha Primitivas Geométricas Polígonos Áreas formadas por várias linhas conectadas Arestas do polígono não podem se cruzar Devem ser áreas convexas O número de segmentos do polígono não é restrito OpenGL assume que todos os polígonos são simples Problema da superfície construída a partir de quadriláteros Quadriláteros são polígonos não planares Caso seja feita alguma transformação, podem deixar de ser polígonos simples Para evitar que isto aconteça, é sempre bom utilizar triângulos para compor as superfícies, pois triângulos são sempre co-planares Primitivas Geométricas Polígonos GL_TRIANGLES: Desenha triângulos a cada 3 vértices fornecidos; GL_TRIANGLE_STRIP: Uma série de triângulos conectados. Após o desenho do primeiro triângulo, cada vértice adicional forma um novo triângulo com dois últimos pontos fornecidos; GL_TRIANGLE_FAN: Uma série de triângulos com um único vértice em comum. O vértice comum é o primeiro vértice fornecido; GL_QUADS: Desenha um quadrilátero a cada 4 vértices fornecidos; GL_QUAD_STRIP: Desenha uma série de quadriláteros. Após o primeiro, apenas mais 2 vértices precisam ser fornecidos para o desenho do segundo quadrilátero; GL_POLYGON: Desenha polígonos convexos simples com um número arbitrário de vértices Visualização Para permitir a visualização de objetos tridimensionais é necessário usar projeção para converter as coordenadas 3D em coordenadas 2D que correspondem a uma visão específica do objeto. Existem dois tipos de projeção: a perspectiva e a paralela. Visualização Projeção em perspectiva: é a que acontece no processo de formação de imagens em nossos olhos ou numa câmera fotográfica, por isso é a que gera imagens mais realistas. Visualização Projeção paralela ou ortogonal : é a forma mais simples de projeção. Nela a imagem de um ponto é definida como a projeção normal deste ponto no plano de projeção. A projeção paralela pode ser vista como uma projeção perspectiva onde o centro de projeção está no infinito. Visualização Projeção ortogonal: glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho(X min, X max, Y min, Y max, Near, Far); Visualização Projeção em perspectiva: glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glPerspective(fovy, aspect, near, far); Visualização Caso você faça a projeção com os comandos glOrtho ou glFrustum, o OpenGL especifica uma matriz default, na qual a câmera está alinhada com o eixo z. A posição da câmera pode ser alterada através das transformações geométricas sobre a matriz de visualização. glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glRotatef(-30, 1.0, 0.0, 0.0); glRotatef(30, 0.0, 1.0, 0.0); glRotatef(30, 0.0, 0.0, 1.0); glTranslatef(2.0,0.0,0.0); Cores As cores em OpenGL são determinadas pelo comando Color Seguem o padrão RGB (Red Green Blue) adotados em diversos sistemas Em OpenGL: Color3 {f,d} ( XRed, XGreen, XBlue), onde : XRed: porcentagem de vermelho (variando de 0.0 a 1.0) XGreen: porcentagem de verde (variando de 0.0 a 1.0) XBlue: porcentagem de azul (variando de 0.0 a 1.0) Transformações Geométricas Em muitas aplicações de computação gráfica, há a necessidade de alterar e manipular o conteúdo de uma cena Animações, por exemplo, são produzidas pelo movimento da câmera ou dos objetos presentes na cena Mudanças em orientação, tamanho e formato estão ligadas às transformações geométricas São cumulativas, ou seja, podem ser aplicadas umas sobre as outras Uma transformação geométrica de OpenGL é armazenada internamente em uma matriz A cada tranformação esta matriz é alterada e usada para desenhar os objeto a partir daquele momento, até que seja novamente alterada Transformações Geométricas Translação Quando aplicada a um objeto, reposiciona o mesmo mudando suas coordenadas (x,y,z) no espaço tridimensional, por fatores Tx, Ty e Tz, respectivamente. Dessa forma, considerando, inicialmente, um objeto com coordenadas espaciais (x,y,z), sua nova posição (x',y',z') após uma operação de translação será: x‘ = x + Tx y‘ = y + Ty z‘ = z + Tz Transformações Geométricas Translação Em OpenGL: Translate {f,d} ( Tx, Ty, Tz ), onde: Tx: é o quanto se quer transladar o objeto em relação ao eixo X Ty: é o quanto se quer transladar o objeto em relação ao eixo Y Tz: é o quanto se quer transladar o objeto em relação ao eixo Z glTranslatef(xf, yf, zf); glBegin(GL_POLYGON); glVertex2f( xf, yf); glVertex2f( xf, yf); glVertex2f( xf, yf); glEnd(); Transformações Geométricas Rotação É o ato de efetuar um giro em um objeto de acordo com um ângulo e um eixo definidos anteriormente. Para efetuar uma rotação há o comando glRotatef(Angulo, x, y, z) que gira o objeto ao redor do vetor (x,y,z). O giro é de Angulo graus, no sentido anti-horário. glRotatef(45.0f,0.0f,0.0f,1.0f);// roda 45 graus no eixo z glBegin(GL_POLYGON); glVertex2f( xf, yf); glVertex2f( xf, yf); glVertex2f( xf, yf); glEnd(); Iluminação Cria a sensação de Profundidade Sem iluminação Objetos parecem planos Adiciona Realismo à cena A sensação de profundidade provê mais realismo Deixa a cena mais bonita Criada através de Fontes de luz: Um ponto no Infinito (ex: o Sol) Um ponto próximo (ex: uma lâmpada incandescente) Uma fonte de luz distribuída (ex: lâmpadas de Neon ou de Gás) Iluminação Como pretendemos utilizar iluminação, é indispensável definir vetores normais para o nosso objeto Iluminação OpenGL permite dois tipos de Shading: O GL_FLAT, o GL_SMOOTH. O GL_FLAT é implementado levando em consideração apenas os vetores normais relativos ao triangulo. O GL_SMOOTH é implementado levando em consideração o modelo de iluminação de Gouraud. Iluminação OpenGL aproxima a iluminação assumindo que a luz pode ser dividida nas suas componentes de vermelho, verde e azul (RGB). As fontes de luz são caracterizadas pelas quantidades RGB que emitem Os materiais das superfícies são caracterizados pelas percentagens dos componentes RGB recebidos que são refletidos nas várias direções. Iluminação OpenGL considera várias formas de reflexão da luz incidente: Emitida: Simula a luz que se origina de um objeto; a cor emissiva de uma superfície adiciona intensidade ao objeto, mas não é afetada por qualquer fonte de luz; ela também não introduz luz adicional da cena. Ambiente: Resultado da luz refletida no ambiente; é uma luz que vem de todas as direções. Difusa: Luz que vem de uma direção, atinge a superfície e é refletida em todas as direções; assim, parece possuir o mesmo brilho independente de onde a câmera está posicionada. Especular: Luz que vem de uma direção e tende a ser refletida numa única direção. Iluminação A iluminação é definida apenas uma vez, na função para inicialização do GLUT GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0}; GLfloat mat_shininess[] = {25.0}; GLfloat light_position[] = {-1.0, 1.0, 1.0, 0.0}; /*Inicia as características gerais dos materiais */ glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); /* Inicia a iluminação */ glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); Configurando OpenGL e GLUT Criando um projeto No menu File -> New -> Project... Escolher Visual Studio Projects escolha Win32 Console Aplication Selecionar o nome do projeto, por exemplo,OpenGL Cube Selecionar o nome da solução, por exemplo, OpenGL Apps Selecionar o caminho do projeto, por exemplo, C:\Temp Clicar em OK Na tela que aparecer clica em next e marcar a opção empty project Baixe os arquivos necessários para a configuração em www.cin.ufpe.br/~vhr/opengl Configurando OpenGL e GLUT Clique com o botão direito no ícone do projeto e depois em propriedades Configurando OpenGL e GLUT Clique em C/C++ depois em General e coloque o diretório com o glut.h em Additonal Include Directories coloque o diretório com o glut.h em Additonal Include Directories Configurando OpenGL e GLUT Agora no menu C/C++/Preprocessor em Preprocessor Definition coloque GLUT_NO_LIB_PRAGMA Configurando OpenGL e GLUT Agora no menuLinker/General coloque o diretorio que contém glut32.lib em additional library directories Configurando OpenGL e GLUT Em Linker/Input va em additional dependencies coloque glut32.lib glu32.lib opengl32.lib nessa ordem. E depois clique em e copie o arquivo glut32.dll para a pasta do executável Exercício Pegar o código inicial em http://www.cin.ufpe.br/~vhr/opengl/exercicio.txt Desenvolver as funções que não estão implementadas no código dado e usando os conceitos acima explicadas Lista de funções para ajudar em: http://www.cin.ufpe.br/~vhr/opengl/Lista de Funções.docx Textura A idéia de textura é, de maneira geral, a sobreposição de um objeto 3D por uma imagem. Dessa forma, é possível dar impressão de relevo, chegando a um maior nível de detalhamento e realismo. Em OpenGL Uma textura costuma ser guardada em uma matriz que contém a informação de cada elemento da textura, que corresponde a um pixel na imagem original, denominado textel. Textura Inicialização da Textura: é necessário especificá-la através da função glTexImage2D(). glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_data); Textura Os parâmetros GL_TEXTURE_MAG_FILTER e GL_TEXTURE_MIN_FILTER referem-se, respectivamente, aos casos em que existe aumento (magnification) e redução (minification). glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); Para definir como a textura será aplicada a cada pixel utiliza-se a função glTexEnvf(). glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); Textura Para desenhar alguns objetos com texturas e outros sem texturas, podemos utilizar as funções glEnable() e glDisable() para ativá-las apenas quando necessárias. É necessário atribuir coordenadas de textura a cada vértice do objeto glTexCoord2fv(xTextura, yTextura); glNormal3fv(xVertice, yVertice, zVertice); glVertex3fv(xVetorNormal, yVetorNormal, zVetorNormal); Exercício Baixar projeto exemplo em www.cin.ufpe.br/~vhr/opengl Tentar modificar a textura no exemplo dado. Referências http://www.dcc.ufla.br/~bruno/aulas/cg/monte-mor/ http://www2.dc.ufscar.br/~saito/download/comp- grafica/OPENGL-Spy.ppt http://www.xmission.com/~nate/opengl.html http://w3.ualg.pt/~srnunes/CG/exemplo4.html http://www.inf.pucrs.br/~manssour/OpenGL/Bibliogr afiaLinks.html