Silicon Graphics OpenGL - Apresentação • Interface para Programação de Aplicações Gráficas O que é? – Fornece métodos para programação grãfica – Realiza a interface entre Software e as chamadas de acesso ao hardware pelo SO. • Máquina de Estados – A cada estado produz um resultado diferente – Deve-se habilitar os estados para tal efeito • Renderizador – Resultado final é uma imagem Silicon Graphics OpenGL - Apresentação • Produzir Software que tenha algum conteúdo gráfico Bi ou Tridimensional O que é? – Software para produção de gráficos estatísticos • Produzir Software visual de Simulação Para que Serve? – Simuladores de Carro ou de Avião para teste de performance e qualidade • Produzir Jogos e Animações – Mercado que vem crescendo desde o surgimento das áreas • Outros Silicon Graphics OpenGL - Apresentação • Define-se a Janela de Contexto O que é? – Algumas bibliotecas, como o Glut facilitam essa operação. • Define as janelas de Visualização Para que Serve? Como Funciona? – Caso nenhuma janela de visualização esteja definida, a janela de contexto será a janela de visualização. • Define o tipo de Projeção a ser usado – Ortográfica ou – Perspectiva Silicon Graphics OpenGL - Apresentação • Habilita os estados da máquina de estados O que é? Para que Serve? Como Funciona? – Operações como teste de profundidade, antialiasing, mapeamento de textura 1D, 2D ou 3D, iluminação, sombras, etc. • Carrega a matriz Identidade – Para garantir que a matriz do mundo possa ser recuperada. • Posiciona a Câmera – De modo a visualizar objetos corretamente. • { Silicon Graphics OpenGL - Apresentação • Empilha a matriz atual – Para recuperá-la posteriormente O que é? Para que Serve? Como Funciona? • Realiza transformações ({Rotação, Escala, Translado, Multiplicação de Matriz}) • Realiza processo de renderização – – – – (Aplica Textura) (Aplica transparência) (aplica reflexao) Desenha primitivas – Recupera matriz do mundo • } • e Desenha na Tela. Silicon Graphics OpenGL - Apresentação O que é? Para que Serve? Como Funciona? Estrutura • A OpenGL define suas próprias estruturas de dados. Muitas delas são compatíveis com as das linguagens de programação que utiliza sua API, porém apresentaremos as estruturas e a estrutura de nomenclatura das funções da OpenGL: • Dados primitivos: – os dados primitivos da OpenGL iniciam com GL e o tipo. • Segue uma tabela com os tipos de dados da OpenGL e os valores que podem assumir. Silicon Graphics OpenGL - Apresentação O que é? Para que Serve? Como Funciona? Estrutura Sufixo Est. Dados b Inteiro 8-bits Em C/C++ signed char Nome OpenGL GLbyte s Inteiro 16-bits short GLshort i Inteiro 32-bit long GLint, GLsizei f ponto flutuante 32-bits ponto flutuante 64-bits Inteiro sem sinal 8-bits Inteiro sem sinal 16-bits Inteiro sem sinal 32-bits float GLfloat, GLclampf double GLdouble, GLclampd unsigned char GLubyte, GLboolean d ub us ui unsigned short GLushort unsigned long GLuint, GLenum, GLbitfield Silicon Graphics OpenGL - Apresentação O que é? Para que Serve? Como Funciona? Estrutura • Com os tipos básicos de dados definidos fica fácil reconhecer funções e quais são os tipos de parâmetros de funções da OpenGL. • As funções OpenGL tem a seguinte estrutura de nomenclatura: • (biblioteca)nomeDaFunção<n>(sufixo)[v], onde: – biblioteca indica a qual biblioteca a função pertence, por exemplo, uma função pura da OpenGL inicia com o prefixo gl..., uma da Glu com glu..., etc. Silicon Graphics OpenGL - Apresentação • (biblioteca)nomeDaFunção<n>(sufixo)[v] O que é? Para que Serve? Como Funciona? Estrutura – nomeDaFunção é o nome da função a ser usada. Exemplo: gluPerspective, o que indica que é a função perspectiva va biblioteca Glu (GL utility library). – n indica quantos dados serão passados como parâmetro e – Sufixo é um dos sufixos dos tipos de dados básicos da openGL, indicando se é Glbyte, Glint, etc. confira a tabela noamente para saber os sufixos possíveis – o terminador v é opcional e indica que o argumento é um vetor com n componentes do tipo definido. Silicon Graphics OpenGL - Apresentação Como O que Fazer? é? Para que Serve? Como Funciona? Estrutura • Utilizando Visual C++ 6 • Inicie novo projeto: Win32 Application • No Menu Project->Settings – No Tab: “Link”, no campo “Object/Library Modules”, adicione: “OpenGL32.lib”, “Glu32.lib”, “Glaux.lib” • Adicione um arquivo C++ source ao projeto. • O arquivo deve incluir os seguintes cabeçalhos: – “windows.h”, “gl/gl.h”, “gl/glu.h”, “gl/glaux.h”, entre <>, ex: #include <gl/gl.h> Silicon Graphics OpenGL - Apresentação Como O que Fazer? é? Para Variáveis que Serve? Como Funciona? • Como trabalharemos sem o auxílio da GLUT, necessita-se de um pouco de conhecimento sobre programação em Windows: • Declara-se as variáveis globais que o Windows necessita para a definição da Janela de Contexto: – – – – HDC hDC=NULL; //Dispositivo de cont. privado HGLRC hRC=NULL;/ /Cont. permanente de renderização HWND hWnd=NULL; // Instância da janela HINSTANCE hInstance; // Instância da Aplicação • Quaisquer outras variáveis necessárias para a sua aplicação. Silicon Graphics OpenGL - Apresentação Como O que Fazer? é? Para Variáveis que Serve? Como CallBack? Funciona? • Para que o Programa possa referenciar uma função é necessário definir um protótipo da função em C para referências em qualquer parte do programa. • Define-se o protótipo da função para tratamento de mensagens do Windows. – LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); Silicon Graphics OpenGL - Apresentação • Em Windows a rotina principal chama-se WinMain que exige, como parâmetros: Como O que Fazer? é? Para Variáveis que Serve? Como CallBack? Funciona? WinMain? – – – – HINSTANCE hInstance, // Instância HINSTANCE hPrevInstance, // Instância prévia LPSTR lpCmdLine,// Parâmetros de linha de comando int nCmdShow // Estado de Exibição da janela • Com exceção do parâmetro de linha de comando, os outros parâmetros são automaticamente preenchidos pelo Sistema Operacional. • A primeira coisa a se fazer é declarar a variável que armazenará a estrutura de mensagens do windows: MSG msg; Silicon Graphics OpenGL - Apresentação Como O que Fazer? é? Para Variáveis que Serve? Como CallBack? Funciona? WinMain? • A rotina principal tem as seguintes obrigações: – Definir o contexto de renderização; – Relizar o loop para: • Recuperar as mensagens que o SO envia para a janela/aplicação e • realizar os procedimentos necessários de acordo com a mensagem recebida. • Estamos prontos para iniciar a configuração da janela de renderização (contexto) e habilitar a OpenGL a realizar os procedimentos para o programa. Silicon Graphics OpenGL - Apresentação Como OGLInit Fazer? Variáveis CallBack? WinMain? • Inicializaremos a janela de Renderização com o procedimento OGLInit que possuirá os parâmetros: – String Título – int largura, – int altura – int profundidade de cores (1,2,8,16,32,... E – bool telacheia • O Processo de criação do contexto de renderização é de difícil entendimento, porém, segue os seguintes passos: – Define-se o estilo da janela através de um objeto da classe janela – Nomeia a classe e tenta registrá-la Silicon Graphics OpenGL - Apresentação Como OGLInit Fazer? Variáveis – – – – – – – – CallBack? – WinMain? – – – – Mostra a Janela Determina se é em tela cheia Coloca • Se for a janela inicializa no topo as configurações Coloca • Tenta o foco mudar doos teclado atributos na janela de exibição do SO Atribui o modelo Inicializa as projeções de exibição do OpenGL da janela (tela cheia ou janela): Tenta Inicializar os Parâmetors (estados) da OpenGL Tenta criar a janela; Retorna True se em todas as tentativas obtiver sucesso Define o descritor do formato de pixel para dizer ao Windows como desenhar; Tenta recuperar um contexto de dispositivo (para gerenciamento de exibição dependendo do seu monitor) Procura um formato de pixel compatível com o descritor; Tenta atribuir o descritor de formato de pixel encontrado ao Windows; Tenta criar o contexto de renderização; tenta ativar o contexto de renderização; Silicon Graphics OpenGL - Apresentação Como OGLInit Fazer? Projeções Variáveis CallBack? WinMain? • As inicializações das projeções serão efetuadas no procedimento ResizeGL() para manter a taxa de aspecto. • Dois tipos de projeções: – Ortográfica: Preserva Paralelismo entre retas, não fornece sensação de profundidade e – Perspectiva: Retas paralelas convergem em um ponto no infinito, retira o paralelismo das retas, fornece sensação de profundidade. Silicon Graphics OpenGL - Apresentação • Ortográfica: Como OGLInit Fazer? Projeções Variáveis CallBack? WinMain? – Verifica se altura=0 (para efeito de prevenção de divisão por 0). Se for atribua 1 a ela. – Defina a Viewport (janela de visualização) com o comando: glViewport(0,0,largura,altura); – Ajuste o modo de definição da matriz para matriz de projeção com o comando: glMatrixMode(GL_PROJECTION); – com o comando: glLoadIdentity(); definimos a matriz de projeção como sendo a identidade. – Defina a projeção ortográfica com o comando glOrtho(esq., dir., base, topo, perto longe), onde esses valores definem o volume de visão como na figura a seguir: Silicon Graphics OpenGL - Apresentação Como OGLInit Fazer? Projeções Variáveis Topo Esq. Dir. CallBack? Direção do plano de Visão W inMain? Base Perto Longe Silicon Graphics OpenGL - Apresentação • Ortográfica: Como OGLInit Fazer? Projeções Variáveis CallBack? WinMain? – Determinado o Volume de visualização muda-se o modelo da matriz para o Modelo/Visão, que define os objetos do mundo, com o comando: glMatrixMode(GL_MODELVIEW); – Recarrega a matriz identidade com o comando glLoadIdentity(); – Retorna do procedimento. Silicon Graphics OpenGL - Apresentação • Perspectiva: Como OGLInit Fazer? Projeções Variáveis CallBack? WinMain? – Verifica se altura=0 (para efeito de prevenção de divisão por 0). Se for atribua 1 a ela. – Defina a Viewport (janela de visualização) com o comando: glViewport(0,0,largura,altura); – Ajuste o modo de definição da matriz para matriz de projeção com o comando: glMatrixMode(GL_PROJECTION); – com o comando: glLoadIdentity(); definimos a matriz de projeção como sendo a identidade. – Defina a projeção perspectiva com um dos comandos abaixo: • glFrustum(esq., dir., base, topo, perto longe) • gluPerspective(fovy,aspect,zPerto,zLonge), onde esses valores definem o volume de visão como na figura a seguir: Silicon Graphics OpenGL - Apresentação glFrustum(esq.,dir.,base,topo,perto,longe) Como OGLInit Fazer? Projeções Variáveis Topo Frustum Esq. CallBack? Dir. WinMain? Perto Base Longe Silicon Graphics OpenGL - Apresentação gluPerspective(fovy,aspecto,perto,longe) Aspecto=l/a Como OGLInit Fazer? Projeções Variáveis CallBack? fovy q a l WinMain? Perto Longe Silicon Graphics OpenGL - Apresentação • Perspectiva: Como OGLInit Fazer? Projeções Variáveis CallBack? WinMain? – Determinado o Volume de visualização muda-se o modelo da matriz para o Modelo/Visão, que define os objetos do mundo, com o comando: glMatrixMode(GL_MODELVIEW); – Recarrega a matriz identidade com o comando glLoadIdentity(); – Retorna do procedimento. Silicon Graphics OpenGL - Apresentação • Inicialização dos estados da OpenGL Como OGLInit Fazer? Projeções Variáveis CallBack? MEFInit WinMain? – Habilita os estados da OpenGL para efeitos de renderização. – Os comandos são: – GLShadeModel(modelo), para determinar o tipo de sombreamento usado para iluminação. – glEnable(GL_Estado), Habilita a OpenGL a realizar os cálculos de renderização para o estado definido. O Estado especifica iluminação, teste de profundidade, transparência, luzes (caso a iluminação esteja habilitada), materiais, textura, etc. – glClearColor(f,f,f), determina com que cor limpar a tela; – glClearDepth(f) determina qual a profundidade do buffer de profundidade a ser limpa; – glHint(chave, valor) determina miscelânea para renderização, tais como cálculo de perspectiva. Silicon Graphics OpenGL - Apresentação Como OGLInit Fazer? Projeções Variáveis CallBack? MEFInit Desenhando WinMain? • A qualquer momento, dentro do programa, pode-se desenhar um objeto na tela. • O procedimento para desenho encontra-se entre os comandos: – glBegin(tipoDePrimitiva) e glEnd(). • Antes de determinar como se desenha na tela do computador usando a OpenGL precisaremos introduzir as primitivas gráficas suportadas pela OpenGL. São elas: • Pontos, Linhas, polígonos (não côncavos), triângulos, quadriláteros, malha de linhas, malha de linhas conectadas, malha de triângulos, triânculos centrados e malha de quadriláteros. • A seguir encontra-se uma figura de como são esses objetos e o s seus nomes para passar como parâmetro para a OpenGL. Silicon Graphics OpenGL - Apresentação Como OGLInit Fazer? Projeções Variáveis CallBack? MEFInit Desenhando WinMain? Silicon Graphics OpenGL - Apresentação Como OGLInit Fazer? Projeções Variáveis CallBack? MEFInit Desenhando WinMain? • Entre os métodos glBegin e glEnd existem apenas um conjunto de funções da OpenGL que são permitidas. São eles: – glVertex*() - atribui a coordenada do vértice; – glColor*() - atribui uma cor ao vértice – glIndex*() - atribui o índice de cor (apenas se trabalharmos com o modo indexado de cores) – glNormal*() - Atribui uma normal ao vértice (ou ao plano) – glEvalCoord*() - calcula coordenadas – glCallList() glCallLists() - executa listas de exibição – glTexCoord*() atribui coordenadas de textura – glEdgeFlag*() - controla desenho de bordas – glMaterial*() - atribui propriedades de reflexão • * significa que o método possui n parâmetros ,sufixo e pode possuir o terminador v; Silicon Graphics OpenGL - Apresentação Como OGLInit Fazer? Projeções Variáveis CallBack? MEFInit Desenhando WinMain? • Portanto, caso desejemos desenhar um triângulo vermelho cujos vértices estão definidos pelos vetores (matrizes linha) v1,v2 e v3 e cuja normal é definida pelo vetor n procederíamos de uma das seguintes formas: • glBegin(GL_TRIANGLE); • glColor3f(1.0f,0.0f,0.0f); • glNormal3fv(*n); • glVertex3fv(*v1); • glVertex3fv(*v2); • glVertex3fv(*v3); • glEnd(); • ou: Silicon Graphics OpenGL - Apresentação Como OGLInit Fazer? Projeções Variáveis CallBack? MEFInit Desenhando WinMain? • • • • • • • • glBegin(GL_TRIANGLE); glColor3f(1.0f,0.0f,0.0f); glNormal3f(n[0],n[1],n[2]); glVertex3f(v1[0],v1[1],v1[2]); glVertex3f(v2[0], v2[1], v2[2]); glVertex3f(v3[0], v3[1], v3[2]); glEnd(); repare que como as funções chamadas terminam em 3f os vetores devem ser do tipo Glfloat e possuir três elementos. • Entre os comandos glBegin e glEnd podem vir quaisquer outros comandos que a linguagem de programação permitir. Silicon Graphics OpenGL - Apresentação Como OGLInit Fazer? Projeções Variáveis CallBack? MEFInit Desenhando WinMain? E a Cena? • Para visualizar efetivamente a Cena deve-se especificar a posição e orientação da câmera hipotética que irá registrá-la. • Isso é realizado especificando a posição da câmera, ou seja, do plano de visão; • A direção para onde a câmera aponta e • O vetor que indica a direção de cima (upVector) da câmera. • Em OpenGL define-se a câmera em qualquer parte do código (exceto entre glBegin() e glEnd()) co mo comando: • gluLookAt(Xc,Yc,Zc,Xd,Yd,Zd,Xu,Zu,Du); Silicon Graphics OpenGL - Apresentação Como OGLInit Fazer? Projeções Variáveis CallBack? MEFInit Desenhando WinMain? •Transformações Silicon Graphics OpenGL - Transformações • Procedimentos utilizados para: – Modificar o valor de cada vértice de um objeto Como O queFazer? são? Variáveis CallBack? WinMain? • V’=Mtn.Mtn-1.(...).Mt2.Mt1.V – Modificar o Valor da matriz de exibição do mundo – Objetivo: Posicionar os objetos no mundo de maneira a compor a cena desejada. Silicon Graphics OpenGL - Transformações • Translação: Como O queFazer? são? Quais Variáveis São? CallBack? WinMain? – Move linearmente um vértice de uma posição a outra do espaço cartesiano • Rotação: – Rotaciona (translada de maneira circular) um ponto em torno de um eixo na angulação desejada • Escala: – Altera o tamanho de um objeto por transladar os vértices do mesmo de maneira desigual. Silicon Graphics OpenGL - Transformações Como O queFazer? são? Translação Quais Variáveis São? Pilha CallBack? de Matriz Como WinMain? Fazer • Definido pela Matriz: – 1 0 0 Tx – 0 1 0 Ty – 0 0 1 Tz –0001 • No OpenGL glTranslate(s)[v](Tx,Ty,Tz) ou: –1 0 0 0 –0 1 0 0 –0 0 1 0 – Tx Ty Tz 1 e pelo comando glMultMat{f,v}(const TIPO *mat) Silicon Graphics OpenGL - Transformações Como O queFazer? são? Translação Quais Variáveis São? Rotação Pilha CallBack? de Matriz Como WinMain? Fazer • Definido por Matriz: – Seja v=(x,y,z)T e u=v/||v||=(x’,y’,z’). – Seja também S, a matriz: – 0 -z’ y’ – z’ 0 -x’ – -y’ x’ 0 – A matriz de Rotação R será (m representam os elementos de M): – mm m0 – mm m0 – mm m 0 – 0 0 0 1 – Dado que: M=u.uT+(cos a).(I-u.uT)+(sen a).S Silicon Graphics OpenGL - Transformações Como O queFazer? são? Translação Quais Variáveis São? Rotação Pilha CallBack? de Matriz Como WinMain? Fazer • No OpenGL utiliza-se o comando: – glRotate(s)[v](a,x,y,z) ou o comando – glMultMatriz{f,d}(const TIPO mat*), onde *mat é o vetor bidimensional contendo a transposta da matriz R previamente apresentada. Silicon Graphics OpenGL - Transformações Como O queFazer? são? Translação Quais Variáveis São? Rotação Pilha CallBack? de Matriz Escala Como WinMain? Fazer • Definido pela Matriz E=: – Sx 0 0 0 – 0 Sy 0 0 – 0 0 Sz 0 –0 0 0 1 • No OpenGL glScale(s)[v](Tx,Ty,Tz) ou: • glMultMat{f,d}(const TIPO *mat), onde mat é um vetor bidimensional da matriz transposta de E fornecida acima. Silicon Graphics OpenGL - Transformações Como O queFazer? são? Quais Variáveis São? Pilha CallBack? de Matriz Como WinMain? Fazer • Ao executar os comandos gl(Rotate,Translate,Scale)* a OpenGL modifica a matriz do Mundo e o resultado final da cena será: • R=Mm.Mp.Objeto • Para recuperar a matriz do Mundo prévia à operação realizada existem 2 procedimentos: – Multiplicar a matriz do mundo pela matriz inversa da operação realizada ou – Empilhar a matriz do mundo atual, realizar as operações desejadas e desempilhá-la novamente. Silicon Graphics OpenGL - Transformações Como O queFazer? são? Quais Variáveis São? Pilha CallBack? de Matriz WinMain? • Manipulando a pilha de matrizes: – Comandos: • glPushMatrix(): empilha a matriz do Mundo • glPopMatriz(): Desempilha a matriz do mundo • OpenGL suporta até 32 matrizes de ordem 4 e inicia com 2 matrizes de ordem 4, uma sendo a matriz de projeção e outra sendo a matriz inicial do mundo Silicon Graphics OpenGL - Transformações Como O queFazer? são? Quais Variáveis São? Pilha CallBack? de Matriz Como WinMain? Fazer • Quaisquer transformações ou comando para empilhar matrizes: • Antes de executar o comando glBegin(primitiva) e/ou depois do comando glEnd() Silicon Graphics OpenGL - Apresentação Como OGLInit Fazer? Projeções Variáveis CallBack? MEFInit Desenhando WinMain? •Iluminação Silicon Graphics OpenGL - Iluminação Para Como queFazer? serve? Variáveis CallBack? WinMain? • Criar a sensação de Profundidade – Sem iluminação Objetos parecem planos • Adicionar Realismo à cena – A sensação de profundidade provê mais realismo • Deixar a cena mais bonita. Silicon Graphics OpenGL - Iluminação • Observe como a iluminação é importante para a representação de Objetos 3D: Para Como queFazer? serve? Exemplos Variáveis CallBack? WinMain? Silicon Graphics OpenGL - Iluminação Para Como queFazer? serve? Exemplos Variáveis CallBack? Luzes WinMain? • Criadas 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) • Alteram um dos 3 Modelos de Iluminação: – Luz Ambiente: modelo básico de iluminação (padrão no OpenGL), o objeto não é iluminado diretamente pela fonte de luz, mas pela luz refletida de outros objetos. É uma aproximação do efeito global de iluminação difusa. Silicon Graphics OpenGL - Iluminação Para Como queFazer? serve? Exemplos Variáveis CallBack? Luzes WinMain? – Reflexão Difusa: Iluminação constante sobre a superfície independente da direção do espectador. A quantidade fracional de luz incidente que é difusamente refletida pode ser ajustada pelo parâmetro Kd=[0,1] (coeficiente de reflexão difusa) – O raio de luz reflete de acordo com a angulação relativa á normal do plano tangente à superfície atingida. q q Silicon Graphics OpenGL - Iluminação Para Como queFazer? serve? Exemplos Variáveis CallBack? Luzes WinMain? – Reflexão Especular: Iluminação não constante sobre a superfície. A quantidade fracional de luz incidente pode ser totalmente refletida, causando o efeito do Ponto Brilhante no objeto. (ex: maçã, metais, vidros, etc.) – O raio de luz reflete de acordo com a angulação relativa á normal do plano tangente à superfície atingida, porém sua intensidade não é constante (como na reflexão difusa). Silicon Graphics OpenGL - Iluminação • Exemplos de Iluminações: Para Como queFazer? serve? Iluminação especular: Exemplos Variáveis CallBack? Luzes WinMain? Cor: Ambiente+Difusa Silicon Graphics OpenGL - Iluminação • Luzes em OpengL: Para Como queFazer? serve? Exemplos Variáveis CallBack? Luzes Representação WinMain? – Vetores quadridimensionais representando os valores R,G,B e alfa. – GLfloat Luz[]={ 0.5f,0.5f,0.5f,1.0f }; – No OpenGL a luz ambiente iluminará toda a cena, pois ela não é proveniente de um ponto específico. – Declara-se a luz ambiente da seguinte forma: – glLightfv(GL_LIGHT1, GL_AMBIENT, Luz) – Onde: Light1 é a variável interna da OpenGL que armazenará os atributos para a luz. – GL_AMBIENT é a constante que identifica o tipo de iluminação e Luz é a cor da iluminação. Silicon Graphics OpenGL - Iluminação Para Como queFazer? serve? Exemplos Variáveis CallBack? Luzes Representação WinMain? – Para a luz difusa : – Ilumina todo e qualquer objeto que esteja no raio de iluminação – Para isso, precisa-se de uma posição para a fonte de luz: – glFloat Posicao=(x,y,z,p), onde p indica se a luz é posicional ou se ela é direcional(está no infinito) – Defina a luz: glLightfv(GL_LIGHT1, GL_DIFFUSE, Luz); – e a posição: glLightfv(GL_LIGHT1, GL_POSITION,posicao); Silicon Graphics OpenGL - Iluminação Para Como queFazer? serve? Exemplos Variáveis CallBack? Luzes Representação WinMain? • Onde definir? • As luzes devem ser definidas fora do escopo glBegin(...) e glEnd(), pois os comandos glEnable e glLight(s)[v]não são permitidos dentro desse escopo. • A OpenGL permite até 8 luzes definidas no ambiente. • A luz especular é definida de maneira idêntica à ambiente, com a exceção de que a variável do modelo de iluminação é GL_SPECULAR • Leitura Recomendada: OpenGL RedBook para maiores informações sobre Iluminação. Silicon Graphics OpenGL - Iluminação Para Como queFazer? serve? Exemplos Variáveis CallBack? Luzes Representação WinMain? Como Fazer? • As declarações de iluminação serão, em nosso exemplo, realizadas dentro do procedimento MEFInit, responsável por ajustar a máquina de estados da OpenGL no estado inicial para os procedimentos de desenho. • Considerando que os vetores de definição das cores da luz e do posicionamento da luz difusa já estão definidos declara-se os seguintes comandos: • glLightfv(GL_LIGHTn, GL_AMBIENT,Luz1) • glLightfv(GL_LIGHTn, GL_DIFFUSE,Luz2) • glLightfv(GL_LIGHTn, GL_POSITION,pos) • E habilita-se a luz GL_LIGHTn com os comandos: • glEnable(GL_LIGHTn) • e glEnable(GL_LIGHTING) Silicon Graphics OpenGL - Apresentação Para Como queFazer? serve? Exemplos Variáveis CallBack? Luzes Representação WinMain? Como Fazer? •Materiais Silicon Graphics OpenGL - Materiais Como O queFazer? são? Variáveis CallBack? WinMain? • Estruturas que indicam como o objeto refletirá a luz – O quanto de cada componente da luz é refletido, – como a luz será refletida e – Luz emitida (pelo próprio objeto) Silicon Graphics OpenGL - Materiais Como O queFazer? são? Funcionamento Variáveis CallBack? WinMain? • Idêntico ao definido pela física óptica (exceto a refração) • Objetos sob luz branca refletirão a componente do material atribuído ao objeto • Cada tipo de iluminação tem uma cor a ser refletida • A intensidade da cor pode ser modificada pelo coeficiente de reflexão especular Silicon Graphics OpenGL - Materiais Como O queFazer? são? Funcionamento Variáveis CallBack? WinMain? • Cor de reflexão difusa do material=(Rm,Gm,Bm)=(255,0,0) • Cor da luz emitida pela fonte de luz=(Re,Ge,Be)=(0,255,255) • Cor da luz refletida (pela iluminação difusa) (Id) = (min(Rm,Re),min(Gm,Ge),min(Bm,Be))= (0,0,0) • Cor do objeto a ser desenhado na tela=Ia+Id+Ie • Cor do pixel a ser desenhado na tela=Ia+Id+Is q q Silicon Graphics OpenGL - Materiais Como O queFazer? são? Funcionamento Variáveis Representação CallBack? WinMain? • O material é definido pelas cores de reflexão ambiente, difusa, especular e de emissão e pelo coeficiente de brilho (Shininess). • As cores são definidas através de um vetor quadridimensional representando os coeficientes R,G,B e alfa da cor (assim como é feito para as luzes). • O coeficiente de Brilho é um valor escalar e indica o expoente especular do material. Silicon Graphics OpenGL - Materiais Como O queFazer? são? Funcionamento Variáveis Representação CallBack? Como WinMain? Fazer? • Os materiais são definidos internamente no OpenGL através do comando: • glMaterial(s)[v](FRONT,Modelo,Dado), onde: • Modelo=GL_AMBIENT,GL_DIFFUSE, GL_SPECULAR, GL_EMISSION ou GL_SHININESS e • Dado é o dado de definição de cor do material ou o coeficiente exponencial para a reflexão especular (expoente especular). Silicon Graphics OpenGL - Materiais Como O queFazer? são? Funcionamento Variáveis Representação CallBack? Como WinMain? Fazer? • • • • • • • • • • • • Glfloat mat=(1.0f,0.0f,0.0f,1.0f); GLfloat bri=50.0f; ... (Rotina de desenho) glPushMatrix() glMaterialfv(FRONT,GL_AMBIENT,mat); glMaterialfv(FRONT,GL_DIFFUSE,mat); glMaterialfv(FRONT,GL_SPECULAR,mat); glMaterialfv(FRONT,GL_EMISSION,mat); glMaterialfv(FRONT,GL_AMBIENT,bri); glBegin;... glEnd();}... Silicon Graphics OpenGL - Transparência O que são? Funcionamento Representação Como Fazer? • Transparência (Blending) Silicon Graphics OpenGL - Transparência Como Transparencia? Fazer? Variáveis CallBack? WinMain? • Método para deixar objetos transparentes; • Combina cores de objetos que já estão no buffer de profundidade com os objetos (transparentes) desenhados; • Cria efeitos visuais avançados; • Não funciona para partes de objetos, apenas para objetos inteiros; Silicon Graphics OpenGL - Transparência Como Transparencia? Fazer? Funcionamento Variáveis CallBack? WinMain? • Utiliza o valor Alfa da cor do objeto para cálculo da transparência; • Ocorre após a rasterização da cena, mas antes da plotagem dos pixels; • O valor Alfa pode ser usado no alpha test para aceitar ou rejeitar um fragmento baseado no valor alfa; • Sem o blending os objetos são desenhados considerando Opacidade plena. • Com o Blending controla-se o quanto da cor existente deve ser combinada com o novo fragmento. Silicon Graphics OpenGL - Transparência • Pensamento natural: Como Transparencia? Fazer? Funcionamento Variáveis CallBack? WinMain? – RGB=cor, Alfa=opacidade – Visão se um objeto através de um vidro verde: • Parte verde, proveniente do vidro, • Parte outra cor, proveniente de objetos • A porcentagem varia dependendo da propriedade de transmissão do vidro • Se o vidro transmite 80% da luz que incide nele (opacidade de 20%), então 20% será verde (cor do vidro) e 80% será a cor do objeto que se vê através do vidro. Silicon Graphics OpenGL - Transparência Como Transparencia? Fazer? Funcionamento Variáveis CallBack? WinMain? • Resultado final depende dos fatores Fonte e Destino; – Durante o blending: • valores do fragmento em processo (fonte) e • valores de cor do pixel armazenado (destino) • São combinados através de um processo de 2 estágios. Silicon Graphics OpenGL - Transparência Como Transparencia? Fazer? Funcionamento Variáveis CallBack? WinMain? • Especifica-se como computar os fatores Fonte e Destino; • Tais fatores são quádruplas RGBA que são multiplicados por cada componente RGBA da fonte e do destino, respectivamente; • Os resultados são, então, adicionados. Silicon Graphics OpenGL - Transparência Como Transparencia? Fazer? Funcionamento Variáveis CallBack? WinMain? • Matematicamente: – Sejam os fatores de blending da fonte e do destino: (Sr,Sg,Sb,Sa) e (Dr,Dg,Db,Da) respectivamente; – Seja os valores RGBA da fonte e destino: (Rs,Gs,Bs,As) e (Rd,Gd,Bd,Ad) respectivamente; – O valor RGBA final será: (RsSr+RdDr,GdDg+GsSg,BsSb+BdDb,AsSa+AdDa) Cada componente dessa quádrupla será limitado ao intervalo [0,1] e modificado se necessário. Silicon Graphics OpenGL - Transparência • Gerando os Fatores Fonte e Destino: Como Transparencia? Fazer? Funcionamento Variáveis CallBack? WinMain? – – – – – – – – – – – – – – através da função glBlendFunc(Glenum sf,Glenum df) Glenum é um vetor com quatro elementos (R,G,B,A). OpenGL define alguns fatores padrão: GL_ZERO=(0,0,0,0) GL_ONE=(1,1,1,1) GL_DST_COLOR=cor do píxel destino GL_SRC_COLOR=Cor do pixel fonte GL_ONE_MINUS_DST_COLOR GL_ONE_MINUS_SRC_COLOR GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA GL_DST_ALPHA GL_ONE_MINUS_DST_ALPHA GL_SRC_ALPHA_SATURATE Silicon Graphics OpenGL - Transparência Como Transparencia? Fazer? Funcionamento Variáveis CallBack? WinMain? • Cada fator tem um Fator relevante a ser usado na função glBlendFunc; • Nem todas as combinações dos fatores fonte e destino fazem sentido; • Alguns usos práticos para os fatores serão vistos no slide seguinte; • A tabela a seguir demonstra os fatores relevantes para cada variável definida no slide anterior: Silicon Graphics OpenGL - Transparência Como Transparencia? Fazer? Funcionamento Variáveis CallBack? WinMain? • Desenha figura composta metade de um objeto, metade de outro: – Source=GL_ONE, – desenhe a imagem fonte; – Source e Destiny=GL_SRC_ALPHA e – Desenhe a 2a. Imagem com alfa=0.5. • Desenhar 3 imagens igualmente: • source=GL_ONE, • desenhe, e • as seguintes proceda da mesma maneira que anteriormente, com alfa=0.3333333 Silicon Graphics OpenGL - Transparência Como Transparencia? Fazer? Funcionamento Variáveis Como Fazer? CallBack? WinMain? • Habilite o BLEND em qualquer parte do programa (exceto no escopo do glBegin() e glEnd()) com o comando glEnable(GL_BLEND); • Desabilite a máscara de profundidade: glDepthMask(GL_FALSE); • Defina como ocorrerá o blend com a função glBlendFunc(srcfctr,dstfctr) • Desenhe; • Habilite a máscara de profundidade e desabilite o blend. Silicon Graphics OpenGL - Antialiasing Como Transparencia? Fazer? Funcionamento Como Fazer? •ANTIALIASING Silicon Graphics OpenGL - Antialiasing Como O Fazer? que é? Variáveis CallBack? WinMain? • Método para eliminar o efeito “escada” de linhas com inclinação no intervalo |(0o,90o)| • Ocorre devido aos pixels serem um método discreto de desenho. Silicon Graphics OpenGL - Antialiasing Como O Fazer? que é? Funcionamento • Calcula-se qual a porcentagem da reta contida no pixel (p) • Realiza um Blending com a cor do pixel de acordo com a porcentagem calculada. Silicon Graphics OpenGL - Antialiasing Como O Fazer? que é? Funcionamento Como Fazer? • Em OpenGL pode-se implementar um algoritmo que faça o antialiasing utilizando Blending ou • Habilitar a Máquina de Estados para realizar o trabalho automaticamente. • Usa-se os comandos: – void glHint(GLenum target, GLenum hint); e – glEnable(GL_POINT_SMOOTH) ou glEnable(GL_LINE_SMOOTH) • Onde os parâmetros target e hint são: Silicon Graphics OpenGL - Antialiasing Como O Fazer? que é? Funcionamento Como Fazer? • GL_POINT_SMOOTH_HINT, GL_LINE_SMOOTH_HINT, GL_POLYGON_SMOOTH_HINT – Especifica a qualidade de amostragem de pontos, linhas ou pol~igonos desejada durante a operação de antialiasing; • GL_FOG_HINT – Especifica se os cálculos para geração de neblina serão feitos por pixel (GL_NICEST) ou por vértice (GL_FASTEST); Silicon Graphics OpenGL - Antialiasing • GL_PERSPECTIVE_CORRECTION_HINT Como O Fazer? que é? Funcionamento Como Fazer? – Especifica a qualidade de cores e de interpolação de coordenadas de textura desejadas; Silicon Graphics OpenGL - Neblina Como O Fazer? que é? Funcionamento Como Fazer? •Neblina Silicon Graphics OpenGL - Neblina Como O Fazer? que é? • Um método para fazer objetos desaparecerem de acordo aom a distância em uma dada direção; • Produz cenas mais realistas; • é um termo geral usado para descrever efeitos atmosféricos similares; • pode ser usado para simular neblina, fumaça ou poluição; • É muito utilizado em aplicações de simulação visual, onde a visibilidade limitada precisa ser aproximada. Silicon Graphics OpenGL - Neblina Como O Fazer? que é? Funcionamento • Combina a cor da neblina com a cor do objeto a ser desenhado de acordo com o fator de blending da neblina; • Esse fator, f, é computado por uma das 3 equações a serem mostradas e limitado ao intervalo [0,1]; Silicon Graphics OpenGL - Neblina O que é? Funcionamento • Onde z é a distância entre o ponto de visão e o centro do fragmento; • Os valores para density, start e end são especificados no comando glFog(GLenum pname, TIPO param); • caso pname seja GL_FOG_MODE, a variável param deve ser GL_EXP, GL_EXP2 ou GL_LINEAR; • se pname for GL_FOG_DENSITY, GL_FOG_START ou GL_FOG_END, param é (ou aponta para) o valor de density, start ou end na equação; Silicon Graphics OpenGL - Neblina • Os valores padrão são 1,0 e 1, respectivamente; Como O Fazer? que é? Funcionamento • Se pname for GL_FOG_COLOR, então param é (ou aponta para) o conjunto de valores que especifica a cor da neblina; • A figura a seguir demonstra o gráfico das funções de visibilidade GL_EXP, GL_EXP2 e GL_LINEAR: Silicon Graphics OpenGL - Neblina Como O Fazer? que é? • Primeiramente habilita-se a máquina de estados a gerar a neblina com glEnable(GL_FOG); Funcionamento • Ajusta o modo da neblina com glFog(s): glFogi(GL_FOG_MODE,GL_EXP); Como Fazer? • aplica a cor da neblina com glFog(s)[v]: glFogfv(GL_FOG_COLOR,*cor); • determina a densidade da neblina: glFogf(GL_FOG_DENSITY,0.35f); • determina como será o cálculo da neblina: glHint(GL_FOG_HINT,GL_DONT_CARE) Silicon Graphics OpenGL - Textura Como O Fazer? que é? Funcionamento Como Fazer? •Mapeamento de Textura Silicon Graphics OpenGL - Textura O que é? • Método para se aplicar uma imagem a um objeto geométrico; • Reduz complexidade de construção de cenas; • Um muro pode ser formado com diversas primitivas (paralelepípedos) representando os tijolos ou • Com um único paralelepípedo e uma textura de Tijolos aplicada a ele. Silicon Graphics OpenGL - Textura O que é? Funcionamento • Especifica-se uma imagem ao OpenGL; – Imagem=Matriz bidimensional com valores de cores (pixels); • Indica como a imagem será aplicada a cada pixel renderizado; • Habilita mapeamento de Textura e • Desenha a cena especificando ambas as coordenadas geométricas e de textura. Silicon Graphics OpenGL - Textura O que é? Funcionamento Especificando • OpenGL não possui métodos para carregar imagens, deve ser implementado pelo programador; • Através de MipMapping especifica-se uma única textura em muitas resoluções diferentes evitando aplicar uma textura com resolução completa a um fragmento distante do ponto de visão (aumentando performance) Silicon Graphics OpenGL - Textura O que é? Funcionamento Especificando • Existem 2 comandos para especificar a textura com os dados carregados na memória: – glTexImage2D, para texturas bidimensionais (imagens) – glTexImage1D, para texturas unidimensionais (funções) Silicon Graphics OpenGL - Textura • glTexImage2D: Parâmetros: O que é? Funcionamento Especificando – GLenum target: reservado para uso futuro; – Glint nível: usado se for especificado múltiplas resoluções para cálculo de MipMapping (LOD) – Glint Componentes: inteiro de 1 a 4 indicando qual dos componentes (R,G,B ou A) será usado para modulação ou transparência; – GLsizei width, GLsizei height: Respectivamente: :Largura e altura da imagem; – Glint Borda: Indica a largura da borda (geralmente zero) – GLenum Formato, GLenum Tipo: Descrevem o formato e o tipo de dados dos dados da imagem da textura Silicon Graphics OpenGL - Textura • glTexImage2D: Parâmetros: O que é? Funcionamento Especificando – GLvoid *pixels: Contêm os dados da imagemtextura, que descreve a imagem em si. – Supondo que carregamos uma imagem na memória e que seus pixels estão definidos no formato RGBA, especificamos uma textura da seguinte forma: – glTexImage2D(GL_TEXTURE_2D,0,3,32,32,0, GL_RGBA,GL_UNSIGNED_BYTE,&imagem) Silicon Graphics OpenGL - Textura • Controle de Filtros: O que é? Funcionamento – Após especificarmos a imagem precisamos especificar como ela será tratada, pois as imagens são retangulares e podem ser aplicadas a objetos não retangulares; Especificando – Existem 2 classes de filtros para texturas: • Filtro de Magnificação, caso a porção da imagem mapeada seja maior que a porção definida e • Filtro de Minificação, caso a porção da imagem mapeada seja menor que a porção definida. Silicon Graphics OpenGL - Textura GL_TEXTURE_MAG_FILTER • Controle de GL_NEAREST Filtros: O que é? GL_LINEAR – O Comando OpenGL para a especificação dos filtros é: glTexParameteri(GL_Texture2D,filtro,procedimento), onde GL_TEXTURE_MIN_FILTER GL_NEAREST Funcionamento – Filtro é GL_TEXTURE_MAG_FILTER ou GL_LINEAR Especificando – GL_TEXTURE_MIN_FILTER GL_NEAREST_MIPMAP_NEAREST – E procedimento é dado pela tabela: GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_NEAREST GL_LINEAR_MIPMAP_LINEAR Silicon Graphics OpenGL - Textura • Controle de Filtros: O que é? Funcionamento Especificando – Métodos: • GL_NEAREST: Utiliza o texel cujas coordenadas se aproxima do centro do Pixel, pode causar aliasing; • GL_LINEAR: Utiliza uma função linear para combinar os texels envolvidos no processo, produz resultados visivelmente melhores; • GL_NEAREST_MIPMAP_NEAREST: Procura o MipMap cujo texel cujas coordenadas se aproximam do centro do Pixel de maneira mais eficiente; • GL_NEAREST_MIPMAP_LINEAR: Procura o MipMap cujo texel cujas coordenadas se aproximam do centro do Pixel de maneira mais eficiente e calcula a contribuição dos outros texels para o cálculo da cor a ser aplicada no pixel; Silicon Graphics OpenGL - Textura • Controle de Filtros: O que é? Funcionamento Especificando – Métodos: • GL_LINEAR_MIPMAP_NEAREST: Procura o MipMap cujo texel cujas coordenadas se aproximam do centro do Pixel de maneira mais eficiente e calcula, de acordo com os outros MipMaps (anterior ou posterior) as contribuições do texel para o pixel; • GL_LINEAR_MIPMAP_LINEAR: Procura o MipMap cujo texel cujas coordenadas se aproximam do centro do Pixel de maneira mais eficiente e calcula , de acordo com outros MipMaps (anterior ou posterior) a contribuição dos outros texels vizinhos para o cálculo da cor a ser aplicada no pixel; Silicon Graphics OpenGL - Textura • Controle de Filtros: O que é? Funcionamento Especificando – Definindo método de aplicação: • A textura é definida através de uma imagem bidimensional com dimensões x e y; • Ao se aplicar a textura em um objeto, pode ocorrer que coordenadas de texels estejam fora do limite da imagem; • Define-se o comportamento da textura para quando isso ocorre através da função glTexParameter(i,f)[v](target,pname,param), • Onde Target deve sempre ser GL_TEXTURE_1D ou GL_TEXTURE_2D; Silicon Graphics OpenGL - Textura • Controle de Filtros: O que é? Funcionamento Especificando – glTexParameter(i,f)[v](target,pname,param), : • Pname pode ser: GL_TEXTURE_WRAP_S, para o comportamento no eixo S (Largura) ou • GL_TEXTURE_WRAP_T, para o comportamento no eixo T (altura); • Param é o valor assumido e pode ser: • GL_REPEAT (repete a textura) ou • GL_CLAMP (Copia a última linha ao longo do resto da textura) Silicon Graphics OpenGL - Textura O que é? Funcionamento • Existem 3 funções possíveis para computar a cor final do objeto a ser desenhado: – Usar a cor da textura como cor final; Especificando Como Aplicar? – Modular a cor da textura de acordo com a cor do material do objeto ou – Combinar a cor da textura com a cor do fragmento a ser desenhado; Silicon Graphics OpenGL - Textura • Modulação e Transparência: O que é? Funcionamento Especificando Como Aplicar? – Especifica como a textura será aplicada à geometria; – É obtida através da função glTexEnv(i,f)[v](Target,pname,param) – Target deve sempre ser GL_TEXTURE_ENV; – Se pname for GL_TEXTURE_ENV_MODE, param pode ser: • GL_DECAL: Simplesmente aplica a textura e a cor do pixel será a cor do texel da textura atribuido a ele; • GL_MODULATE: Modula a cor da textura de acordo com o material do objeto ou • GL_BLEND: Aplica transparência à textura permitindo transparência seletiva na textura. Silicon Graphics OpenGL - Textura O que é? Funcionamento Especificando Como Aplicar? Habilitando • Para habilitar o mapeamento de textura utiliza-se a função glEnable com um dos dois parâmetros: – GL_TEXTURE_1D: para texturas unidimensionais ou – GL_TEXTURE_2D: para texturas bidimensionais; Silicon Graphics OpenGL - Textura O que é? Funcionamento Especificando Como Aplicar? Habilitando Desenhando • Entre o glBegin e glEnd e para cada vértice utiliza-se a função: • glTexCoord(1,2)(f,d)[v](dado) para especificar qual coordenada de textura (texel) aplicar àquele vértice. • Ou, Deixar a OpenGL calcular as coordenadas automaticamente. • (Trabalho para graduação)