iluminação. realismo no mundo real, para que seja possível enxergar objetos em um ambiente, é...

46
Iluminação Iluminação

Upload: benedita-beretta-chagas

Post on 07-Apr-2016

236 views

Category:

Documents


14 download

TRANSCRIPT

IluminaçãoIluminação

RealismoRealismo

No mundo real, para que seja possível enxergar No mundo real, para que seja possível enxergar objetos em um ambiente, é fundamental que objetos em um ambiente, é fundamental que exista pelo menos uma fonte de luz. De forma exista pelo menos uma fonte de luz. De forma simplificada, objetos são visíveis porque simplificada, objetos são visíveis porque refletem e absorvem raios de luz. Portanto, a refletem e absorvem raios de luz. Portanto, a noção de uma cena 3D com realismo está noção de uma cena 3D com realismo está intimamente ligada à idéia de iluminação, pois intimamente ligada à idéia de iluminação, pois os pontos na superfície de um objeto iluminado os pontos na superfície de um objeto iluminado possuem diferentes tonalidades de acordo com possuem diferentes tonalidades de acordo com a luz recebida.a luz recebida.

Remoção de Superfícies EscondidasRemoção de Superfícies Escondidas

A idéia de superfícies escondidas parte do A idéia de superfícies escondidas parte do princípio que os objetos serão exibidos princípio que os objetos serão exibidos não mais em não mais em wireframewireframe, mas, sim, como , mas, sim, como sólidos. Portanto, é necessário descobrir sólidos. Portanto, é necessário descobrir quais faces de cada objeto que realmente quais faces de cada objeto que realmente devem aparecer na cena e quais, não.devem aparecer na cena e quais, não.

Dependendo da posição do observador, Dependendo da posição do observador, podem ocorrer duas situações:podem ocorrer duas situações:

Em um mesmo objeto pode haver faces Em um mesmo objeto pode haver faces que não são visíveis por estarem que não são visíveis por estarem posicionadas atrás de outras faces – são posicionadas atrás de outras faces – são as chamadas faces traseiras;as chamadas faces traseiras;

Pode haver objetos que ficam oclusos por Pode haver objetos que ficam oclusos por outros objetos.outros objetos.

Utilizando LuzesUtilizando Luzes

Inicialmente, é preciso definir o modelo de Inicialmente, é preciso definir o modelo de colorização que será utilizado. OpenGL colorização que será utilizado. OpenGL fornece dois modelos: um polígono fornece dois modelos: um polígono preenchido pode ser desenhado com uma preenchido pode ser desenhado com uma única cor (GL_FLAT), ou com uma única cor (GL_FLAT), ou com uma variação de tonalidades (GL_SMOOTH, variação de tonalidades (GL_SMOOTH, também chamado de modelo de também chamado de modelo de colorização. A função colorização. A função glShadeModel()glShadeModel() é é usada para especificar a técnica de usada para especificar a técnica de colorização desejada. colorização desejada.

Quando objetos 3D sólidos são exibidos, é Quando objetos 3D sólidos são exibidos, é importante desenhar os objetos que estão mais importante desenhar os objetos que estão mais próximos do observador (ou posição da próximos do observador (ou posição da câmera), eliminando objetos que ficam câmera), eliminando objetos que ficam "escondidos", ou "parcialmente escondidos", por "escondidos", ou "parcialmente escondidos", por estes. Sendo assim,algoritmos de remoção de estes. Sendo assim,algoritmos de remoção de elementos escondidos foram desenvolvidos elementos escondidos foram desenvolvidos para determinar as linhas, arestas, superfícies para determinar as linhas, arestas, superfícies ou volumes que são visíveis ou não para um ou volumes que são visíveis ou não para um observador localizado em um ponto específico observador localizado em um ponto específico no espaço. A complexidade do problema dos no espaço. A complexidade do problema dos elementos ocultos resultou em um grande elementos ocultos resultou em um grande número de soluções na Computação Gráfica.número de soluções na Computação Gráfica.

A OpenGL possui um A OpenGL possui um depth bufferdepth buffer que trabalha através que trabalha através da associação de uma profundidade, ou distância, do da associação de uma profundidade, ou distância, do plano de visualização (geralmente o plano de corte mais plano de visualização (geralmente o plano de corte mais próximo do observador) com cada próximo do observador) com cada pixelpixel da da windowwindow. . Inicialmente, os valores de profundidade são Inicialmente, os valores de profundidade são especificados para serem o maior possível através do especificados para serem o maior possível através do comando comando glClear(GL_DEPTH_BUFFER_BIT)glClear(GL_DEPTH_BUFFER_BIT). . Entretanto, habilitando o Entretanto, habilitando o depth-bufferingdepth-buffering através dos através dos comandos comandos glutInitDisplayMode(GLUT_DOUBLE | glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | )GLUT_RGB | GLUT_DEPTH | ) e e glEnable(GL_DEPTH_TEST)glEnable(GL_DEPTH_TEST), antes de cada , antes de cada pixelpixel ser ser desenhado é feita uma comparação com o valor de desenhado é feita uma comparação com o valor de profundidade já armazenado. Se o valor de profundidade profundidade já armazenado. Se o valor de profundidade for menor (está mais próximo) o for menor (está mais próximo) o pixelpixel é desenhado e o é desenhado e o valor de profundidade é atualizado. Caso contrário as valor de profundidade é atualizado. Caso contrário as informações do pixel são desprezadas.informações do pixel são desprezadas.

// Função responsável por inicializar parâmetros e variáveis// Função responsável por inicializar parâmetros e variáveis

void Inicializa (void)void Inicializa (void){ { // Define a cor de fundo da janela como branca// Define a cor de fundo da janela como branca

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);glClearColor(1.0f, 1.0f, 1.0f, 1.0f);// Habilita a definição da cor do material a partir da cor// Habilita a definição da cor do material a partir da cor

correntecorrenteglEnable(GL_COLOR_MATERIAL);glEnable(GL_COLOR_MATERIAL);//Habilita o uso de iluminação//Habilita o uso de iluminaçãoglEnable(GL_LIGHTING); glEnable(GL_LIGHTING); // Habilita a luz de número 0// Habilita a luz de número 0glEnable(GL_LIGHT0);glEnable(GL_LIGHT0);// Habilita o depth-buffering// Habilita o depth-bufferingglEnable(GL_DEPTH_TEST);glEnable(GL_DEPTH_TEST);

Em OpenGL a cor de uma fonte de luz é Em OpenGL a cor de uma fonte de luz é caracterizada pela quantidade de vermelho (R), caracterizada pela quantidade de vermelho (R), verde (G) e azul (B) que ela emite, e o material verde (G) e azul (B) que ela emite, e o material de uma superfície é caracterizado pela de uma superfície é caracterizado pela porcentagem dos componentes R, G e B que porcentagem dos componentes R, G e B que chegam e são refletidos em várias direções. No chegam e são refletidos em várias direções. No modelo de iluminação a luz em uma cena vem modelo de iluminação a luz em uma cena vem de várias fontes de luz que podem ser "ligadas" de várias fontes de luz que podem ser "ligadas" ou "desligadas" individualmente. A luz pode vir ou "desligadas" individualmente. A luz pode vir de uma direção ou posição (por exemplo, uma de uma direção ou posição (por exemplo, uma lâmpada) ou como resultado de várias reflexões lâmpada) ou como resultado de várias reflexões (luz ambiente - não é possível determinar de (luz ambiente - não é possível determinar de onde ela vem, mas ela desaparece quando a onde ela vem, mas ela desaparece quando a fonte de luz é desligada).fonte de luz é desligada).

Fontes de LuzFontes de Luz

Uma fonte de luz pontual é aquela cujos Uma fonte de luz pontual é aquela cujos raios de luz emanam uniformemente em raios de luz emanam uniformemente em todas as direções a partir de um único todas as direções a partir de um único ponto. Nesse caso, a iluminação de um ponto. Nesse caso, a iluminação de um objeto varia de uma parte para outra, objeto varia de uma parte para outra, dependendo da direção e da distância da dependendo da direção e da distância da fonte de luz.fonte de luz.

Já a luz direcional, os raios de luz vem Já a luz direcional, os raios de luz vem sempre na mesma direção. Portanto, o sempre na mesma direção. Portanto, o seu efeito é percebido dependendo da seu efeito é percebido dependendo da orientação da superfície. Por exemplo, orientação da superfície. Por exemplo, uma face é plenamente iluminada se uma face é plenamente iluminada se estiver perpendicular aos raios de luz estiver perpendicular aos raios de luz incidentes. Quanto mais oblíqua uma face incidentes. Quanto mais oblíqua uma face estiver em relação aos raios de luz, menor estiver em relação aos raios de luz, menor será a sua iluminação.será a sua iluminação.

Finalmente, a fonte de luz do tipo Spot é Finalmente, a fonte de luz do tipo Spot é semelhante à pontual, porém os raios de semelhante à pontual, porém os raios de luz são emitidos na forma de um cone, luz são emitidos na forma de um cone, apontado para determinada direção. Isso apontado para determinada direção. Isso faz com que a intensidade da luz diminua faz com que a intensidade da luz diminua conforme o raio de luz se desvia dessa conforme o raio de luz se desvia dessa direção.direção.

No modelo de iluminação OpenGL a fonte de luz No modelo de iluminação OpenGL a fonte de luz tem efeito somente quando existem superfícies tem efeito somente quando existem superfícies que absorvem e refletem luz. Assume-se que que absorvem e refletem luz. Assume-se que cada superfície é composta de um material com cada superfície é composta de um material com várias propriedades. O material pode emitir luz, várias propriedades. O material pode emitir luz, refletir parte da luz incidente em todas as refletir parte da luz incidente em todas as direções, ou refletir uma parte da luz incidente direções, ou refletir uma parte da luz incidente numa única direção, tal como um espelho. numa única direção, tal como um espelho. Então, a OpenGL considera que a luz é dividida Então, a OpenGL considera que a luz é dividida em quatro componentes independentes (que em quatro componentes independentes (que são colocadas juntas): são colocadas juntas):

AmbienteAmbiente: resultado da luz refletida no ambiente; é uma : resultado da luz refletida no ambiente; é uma luz que vem de todas as direções;luz que vem de todas as direções;

DifusaDifusa: luz que vem de uma direção, atinge a superfície : luz que vem de uma direção, atinge a superfície e é refletida em todas as direções; assim, parece e é refletida em todas as direções; assim, parece possuir o mesmo brilho independente de onde a câmera possuir o mesmo brilho independente de onde a câmera está posicionada;está posicionada;

EspecularEspecular: luz que vem de uma direção e tende a ser : luz que vem de uma direção e tende a ser refletida numa única direção;refletida numa única direção;

EmissivaEmissiva: simula a luz que se origina de um objeto; a : simula a luz que se origina de um objeto; a cor emissiva de uma superfície adiciona intensidade ao cor emissiva de uma superfície adiciona intensidade ao objeto, mas não é afetada por qualquer fonte de luz; ela objeto, mas não é afetada por qualquer fonte de luz; ela também não introduz luz adicional da cena.também não introduz luz adicional da cena.

A cor do material de um objeto depende A cor do material de um objeto depende da porcentagem de luz vermelha, verde e da porcentagem de luz vermelha, verde e azul incidente que ele reflete. Assim como azul incidente que ele reflete. Assim como as luzes, o material possui cor ambiente, as luzes, o material possui cor ambiente, difusa e especular diferentes, que difusa e especular diferentes, que determinam como será a luz refletida. Isto determinam como será a luz refletida. Isto é combinado com as propriedades das é combinado com as propriedades das fontes de luz, de tal maneira que a fontes de luz, de tal maneira que a reflexão ambiente e difusa definem a cor reflexão ambiente e difusa definem a cor do material. A especular é geralmente do material. A especular é geralmente cinza ou branca.cinza ou branca.

Os componentes de cor especificados para a luz Os componentes de cor especificados para a luz possuem um significado diferente dos possuem um significado diferente dos componentes de cor especificados para os componentes de cor especificados para os materiais. Para a luz, os números correspondem materiais. Para a luz, os números correspondem a uma porcentagem da intensidade total para a uma porcentagem da intensidade total para cada cor. Se os valores R, G e B para a cor da cada cor. Se os valores R, G e B para a cor da luz são 1, a luz é branca com o maior brilho luz são 1, a luz é branca com o maior brilho possível. Se os valores são 0.5 a cor ainda é possível. Se os valores são 0.5 a cor ainda é branca, mas possui metade da intensidade, por branca, mas possui metade da intensidade, por isso parece cinza. Se R=G=1 e B=0, a luz isso parece cinza. Se R=G=1 e B=0, a luz parece amarela.parece amarela.

Para os materiais, os números correspondem às Para os materiais, os números correspondem às proporções refletidas destas cores. Se R=1, proporções refletidas destas cores. Se R=1, G=0.5 e B=0 para um material, este material G=0.5 e B=0 para um material, este material reflete toda luz vermelha incidente, metade da reflete toda luz vermelha incidente, metade da luz verde e nada da luz azul. Assim, luz verde e nada da luz azul. Assim, simplificadamente, a luz que chega no simplificadamente, a luz que chega no observador é dada por (LR.MR, LG.MG, observador é dada por (LR.MR, LG.MG, LB.MB), onde (LR, LG, LB) são os componentes LB.MB), onde (LR, LG, LB) são os componentes da luz e (MR, MG, MB) os componentes do da luz e (MR, MG, MB) os componentes do material.material.

PráticaPrática

1 - Compile e execute o código fonte 1 - Compile e execute o código fonte teapot3D_Luz.cpp;teapot3D_Luz.cpp;2 - Substitua a chamada para a função 2 - Substitua a chamada para a função glutWireTeapot(50.0f);glutWireTeapot(50.0f); (usada para (usada para desenhar o wire-frame de um desenhar o wire-frame de um teapotteapot) por ) por glutSolidTeapot(50.0f);glutSolidTeapot(50.0f);, compile e execute o , compile e execute o programa. Olhando a imagem gerada se programa. Olhando a imagem gerada se observa que a mesma parece 2D. Isto ocorre observa que a mesma parece 2D. Isto ocorre porque a versão porque a versão SolidSolid deve ser usada somente deve ser usada somente quando se está trabalhando com iluminação. quando se está trabalhando com iluminação.

3 - Para utilizar a iluminação em OpenGL, 3 - Para utilizar a iluminação em OpenGL, passe mais um parâmetro para as funções passe mais um parâmetro para as funções glClearglClear e e glutInitDisplayModeglutInitDisplayMode, da , da seguinte maneira: seguinte maneira: glClear(GL_COLOR_BUFFER_BIT | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);GL_DEPTH_BUFFER_BIT);glutInitDisplayMode(GLUT_DOUBLE | glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); GLUT_RGB | GLUT_DEPTH);

4 - substitua a função 4 - substitua a função InicializaInicializa do seu código pela função do seu código pela função InicializaInicializa apresentada abaixo. Compile e execute o apresentada abaixo. Compile e execute o programa para ver a nova imagem gerada. programa para ver a nova imagem gerada.

void Inicializa (void)void Inicializa (void){ { GLfloat luzAmbiente[4]={0.2,0.2,0.2,1.0}; GLfloat luzAmbiente[4]={0.2,0.2,0.2,1.0}; GLfloat luzDifusa[4]={0.7,0.7,0.7,1.0};GLfloat luzDifusa[4]={0.7,0.7,0.7,1.0}; // "cor" // "cor" GLfloat luzEspecular[4]={1.0, 1.0, 1.0, 1.0};// "brilho“GLfloat luzEspecular[4]={1.0, 1.0, 1.0, 1.0};// "brilho“GLfloat posicaoLuz[4]={0.0, 50.0, 50.0, 1.0};GLfloat posicaoLuz[4]={0.0, 50.0, 50.0, 1.0};// Capacidade de brilho do material// Capacidade de brilho do materialGLfloat especularidade[4]={1.0,1.0,1.0,1.0}; GLfloat especularidade[4]={1.0,1.0,1.0,1.0}; GLint especMaterial = 60; GLint especMaterial = 60; // Especifica que a cor de fundo da janela será preta// Especifica que a cor de fundo da janela será pretaglClearColor(0.0f, 0.0f, 0.0f, 1.0f);glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Habilita o // Habilita o

modelo de colorização de Gouraudmodelo de colorização de Gouraud

glShadeModel(GL_SMOOTH);glShadeModel(GL_SMOOTH);// Define a refletância do material// Define a refletância do materialglMaterialfv(GL_FRONT,GL_SPECULAR, especularidade);glMaterialfv(GL_FRONT,GL_SPECULAR, especularidade);// Define a concentração do brilho// Define a concentração do brilhoglMateriali(GL_FRONT,GL_SHININESS,especMaterial);glMateriali(GL_FRONT,GL_SHININESS,especMaterial);// Ativa o uso da luz ambiente// Ativa o uso da luz ambienteglLightModelfv(GL_LIGHT_MODEL_AMBIENT, luzAmbiente);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, luzAmbiente);// Define os parâmetros da luz de número 0// Define os parâmetros da luz de número 0glLightfv(GL_LIGHT0, GL_AMBIENT, luzAmbiente);glLightfv(GL_LIGHT0, GL_AMBIENT, luzAmbiente);glLightfv(GL_LIGHT0, GL_DIFFUSE, luzDifusa );glLightfv(GL_LIGHT0, GL_DIFFUSE, luzDifusa );glLightfv(GL_LIGHT0, GL_SPECULAR, luzEspecular );glLightfv(GL_LIGHT0, GL_SPECULAR, luzEspecular );glLightfv(GL_LIGHT0, GL_POSITION, posicaoLuz );glLightfv(GL_LIGHT0, GL_POSITION, posicaoLuz );// Habilita a definição da cor do material a partir da cor corrente// Habilita a definição da cor do material a partir da cor correnteglEnable(GL_COLOR_MATERIAL);glEnable(GL_COLOR_MATERIAL);//Habilita o uso de iluminação//Habilita o uso de iluminaçãoglEnable(GL_LIGHTING); glEnable(GL_LIGHTING); // Habilita a luz de número 0// Habilita a luz de número 0glEnable(GL_LIGHT0);glEnable(GL_LIGHT0);// Habilita o depth-buffering// Habilita o depth-bufferingglEnable(GL_DEPTH_TEST);glEnable(GL_DEPTH_TEST);angle=45;angle=45;} }

5 - Agora vamos estudar algumas funções 5 - Agora vamos estudar algumas funções chamadas no código apresentado acima. chamadas no código apresentado acima. Primeiro, vamos considerar a função Primeiro, vamos considerar a função glShadeModel()glShadeModel(), que é usada para , que é usada para especificar a técnica de tonalização especificar a técnica de tonalização desejada. Experimente trocar o parâmetro desejada. Experimente trocar o parâmetro GL_SMOOTH por GL_FLATGL_SMOOTH por GL_FLAT

6 - Troque os valores usados para inicializar 6 - Troque os valores usados para inicializar a variável a variável luzEspecularluzEspecular na função na função InicializaInicializa por por {1.0, 0.0, 0.0, 1.0}{1.0, 0.0, 0.0, 1.0}. Explique o . Explique o que acontece neste caso. que acontece neste caso.

7 - Altere o valor de inicialização da variável 7 - Altere o valor de inicialização da variável especMaterialespecMaterial para 10, compile e execute para 10, compile e execute o programa. Depois altere o valor de o programa. Depois altere o valor de inicialização desta mesma variável para inicialização desta mesma variável para 100, compile e execute o programa. 100, compile e execute o programa.

8 - Agora coloque as linhas de código que 8 - Agora coloque as linhas de código que aparecem abaixo em comentário: aparecem abaixo em comentário: // GLfloat especularidade[4]={1.0,1.0,1.0,1.0}; // GLfloat especularidade[4]={1.0,1.0,1.0,1.0}; // GLint especMaterial = 60; // GLint especMaterial = 60; // glMaterialfv(GL_FRONT,GL_SPECULAR, // glMaterialfv(GL_FRONT,GL_SPECULAR, especularidade); especularidade); // glMateriali(GL_FRONT,GL_SHININESS,// glMateriali(GL_FRONT,GL_SHININESS,especMaterial); especMaterial); // glLightfv(GL_LIGHT0, GL_SPECULAR, // glLightfv(GL_LIGHT0, GL_SPECULAR, luzEspecular ); luzEspecular );

9 - Altere o valor de inicialização da 9 - Altere o valor de inicialização da variável variável luzAmbienteluzAmbiente para para {0.1,0.1,0.1,1.0}{0.1,0.1,0.1,1.0}, compile e execute o , compile e execute o programa. Altere o valor desta mesma programa. Altere o valor desta mesma variável para variável para {0.4,0.4,0.4,1.0}{0.4,0.4,0.4,1.0}, compile e , compile e execute o programa. Agora altere o valor execute o programa. Agora altere o valor desta mesma variável para desta mesma variável para {0.8,0.8,0.8,1.0}{0.8,0.8,0.8,1.0}, compile e execute o , compile e execute o programa.programa.

10 - A maioria dos objetos em Computação 10 - A maioria dos objetos em Computação Gráfica são representados através de uma Gráfica são representados através de uma malha de polígonos. Para exemplificar a malha de polígonos. Para exemplificar a utilização de uma malha de polígonos, utilização de uma malha de polígonos, elimine a chamada para a função elimine a chamada para a função glutSolidTeapot(50.0f);glutSolidTeapot(50.0f); e coloque o código e coloque o código abaixo no seu lugar. abaixo no seu lugar.

// Desenha um cubo// Desenha um cuboglBegin(GL_POLYGON); // Face posteriorglBegin(GL_POLYGON); // Face posteriorglNormal3f(0,0,1); // Normal da faceglNormal3f(0,0,1); // Normal da faceglVertex3f(50.0, 50.0, 50.0);glVertex3f(50.0, 50.0, 50.0);glVertex3f(-50.0, 50.0, 50.0);glVertex3f(-50.0, 50.0, 50.0);glVertex3f(-50.0, -50.0, 50.0);glVertex3f(-50.0, -50.0, 50.0);glVertex3f(50.0, -50.0, 50.0);glVertex3f(50.0, -50.0, 50.0);glEnd();glEnd();glBegin(GL_POLYGON); // Face frontalglBegin(GL_POLYGON); // Face frontalglNormal3f(0,0,-1); // Normal da faceglNormal3f(0,0,-1); // Normal da faceglVertex3f(50.0, 50.0, -50.0);glVertex3f(50.0, 50.0, -50.0);glVertex3f(50.0, -50.0, -50.0);glVertex3f(50.0, -50.0, -50.0);glVertex3f(-50.0, -50.0, -50.0);glVertex3f(-50.0, -50.0, -50.0);glVertex3f(-50.0, 50.0, -50.0);glVertex3f(-50.0, 50.0, -50.0);glEnd(); glEnd();

glBegin(GL_POLYGON); // Face lateral esquerdaglBegin(GL_POLYGON); // Face lateral esquerdaglNormal3f(-1,0,0); // Normal da faceglNormal3f(-1,0,0); // Normal da faceglVertex3f(-50.0, 50.0, 50.0);glVertex3f(-50.0, 50.0, 50.0);glVertex3f(-50.0, 50.0, -50.0);glVertex3f(-50.0, 50.0, -50.0);glVertex3f(-50.0, -50.0, -50.0);glVertex3f(-50.0, -50.0, -50.0);glVertex3f(-50.0, -50.0, 50.0);glVertex3f(-50.0, -50.0, 50.0);glEnd();glEnd();glBegin(GL_POLYGON);glBegin(GL_POLYGON); // Face lateral direita// Face lateral direitaglNormal3f(1,0,0); // Normal da faceglNormal3f(1,0,0); // Normal da faceglVertex3f(50.0, 50.0, 50.0);glVertex3f(50.0, 50.0, 50.0);glVertex3f(50.0, -50.0, 50.0);glVertex3f(50.0, -50.0, 50.0);glVertex3f(50.0, -50.0, -50.0);glVertex3f(50.0, -50.0, -50.0);glVertex3f(50.0, 50.0, -50.0);glVertex3f(50.0, 50.0, -50.0);glEnd(); glEnd();

glBegin(GL_POLYGON);glBegin(GL_POLYGON); // Face superior// Face superiorglNormal3f(0,1,0); // Normal da faceglNormal3f(0,1,0); // Normal da faceglVertex3f(-50.0, 50.0, -50.0);glVertex3f(-50.0, 50.0, -50.0);glVertex3f(-50.0, 50.0, 50.0);glVertex3f(-50.0, 50.0, 50.0);glVertex3f(50.0, 50.0, 50.0);glVertex3f(50.0, 50.0, 50.0);glVertex3f(50.0, 50.0, -50.0);glVertex3f(50.0, 50.0, -50.0);glEnd();glEnd();glBegin(GL_POLYGON);glBegin(GL_POLYGON); // Face inferior// Face inferiorglNormal3f(0,-1,0); // Normal da faceglNormal3f(0,-1,0); // Normal da faceglVertex3f(-50.0, -50.0, -50.0);glVertex3f(-50.0, -50.0, -50.0);glVertex3f(50.0, -50.0, -50.0);glVertex3f(50.0, -50.0, -50.0);glVertex3f(50.0, -50.0, 50.0);glVertex3f(50.0, -50.0, 50.0);glVertex3f(-50.0, -50.0, 50.0);glVertex3f(-50.0, -50.0, 50.0);glEnd(); glEnd();

Funções de iluminaçãoFunções de iluminaçãoglShadeModel(GL_SMOOTH);glShadeModel(GL_SMOOTH); estabelece o estabelece o modelo de colorização: modelo de colorização: GL_FLATGL_FLAT (a cor não (a cor não varia na primitiva que é desenhada); ou varia na primitiva que é desenhada); ou GL_SMOOTHGL_SMOOTH (a cor de cada ponto da primitiva (a cor de cada ponto da primitiva é interpolada a partir da cor calculada nos é interpolada a partir da cor calculada nos vértices). Seu protótipo é: vértices). Seu protótipo é: void glShadeModel(GLenum mode);void glShadeModel(GLenum mode);. Descrição . Descrição dos parâmetros: dos parâmetros: modemode especifica o modelo de especifica o modelo de colorização, sendo que o colorização, sendo que o defaultdefault é é GL_SMOOTHGL_SMOOTH..

glMaterialfv(GL_FRONT,GL_SPECULAR, glMaterialfv(GL_FRONT,GL_SPECULAR, especularidade);especularidade); estabelece os parâmetros do material que serão estabelece os parâmetros do material que serão usados pelo modelo de iluminação. Possui usados pelo modelo de iluminação. Possui algumas variações cujos protótipos são: algumas variações cujos protótipos são: glMaterialf(GLenum face, GLenum pname, GLfloat glMaterialf(GLenum face, GLenum pname, GLfloat param);param); glMateriali(GLenum face, GLenum pname, GLint glMateriali(GLenum face, GLenum pname, GLint param);param); glMaterialfv(GLenum face, GLenum pname, const glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);GLfloat *params); glMaterialiv(GLenum face, GLenum pname, const glMaterialiv(GLenum face, GLenum pname, const GLint *params);GLint *params);

Descrição dos parâmetros:Descrição dos parâmetros: faceface determina se as propriedades do material dos determina se as propriedades do material dos

polígonos que estão sendo especificadas são polígonos que estão sendo especificadas são frontfront (GL_FRONT), (GL_FRONT), backback (GL_BACK) ou ambas (GL_BACK) ou ambas (GL_FRONT_AND_BACK); (GL_FRONT_AND_BACK); pnamepname para as duas primeiras variações especifica o para as duas primeiras variações especifica o parâmetro de um único valor que está sendo parâmetro de um único valor que está sendo determinado (atualmente apenas GL_SHININESS determinado (atualmente apenas GL_SHININESS possui um único valor como parâmetro); para as duas possui um único valor como parâmetro); para as duas últimas variações, que recebem um vetor como últimas variações, que recebem um vetor como parâmetro, pode determinar as seguintes propriedades parâmetro, pode determinar as seguintes propriedades do material: GL_AMBIENT, GL_DIFFUSE, do material: GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION, GL_SHININESS, GL_SPECULAR, GL_EMISSION, GL_SHININESS, GL_AMBIENT_AND_DIFFUSE ou GL_AMBIENT_AND_DIFFUSE ou GL_COLOR_INDEXES; GL_COLOR_INDEXES;

paramparam (GLfloat ou GLint) especifica o valor que será (GLfloat ou GLint) especifica o valor que será atribuído para o parâmetro determinado por atribuído para o parâmetro determinado por pnamepname (neste caso, GL_SHININESS); (neste caso, GL_SHININESS); paramsparams (GLfloat* ou GLint*) um vetor de números reais (GLfloat* ou GLint*) um vetor de números reais ou inteiros que contém as componentes da propriedade ou inteiros que contém as componentes da propriedade que está sendo espeficada; que está sendo espeficada; Através desta função é possível determinar as Através desta função é possível determinar as propriedades de refletância do material dos polígonos. propriedades de refletância do material dos polígonos. As propriedades GL_AMBIENT, GL_DIFFUSE e As propriedades GL_AMBIENT, GL_DIFFUSE e GL_SPECULAR afetam a maneira na qual as GL_SPECULAR afetam a maneira na qual as componentes de luz incidente são refletidas. componentes de luz incidente são refletidas. GL_EMISSION é usado para materiais que possuem GL_EMISSION é usado para materiais que possuem "luz própria". GL_SHININESS pode variar de 0 a 128 "luz própria". GL_SHININESS pode variar de 0 a 128 (quanto maior o valor, maior é a área de (quanto maior o valor, maior é a área de highlighthighlight especular na superfície). GL_COLOR_INDEXES é especular na superfície). GL_COLOR_INDEXES é usado para as propriedades de refletância do material usado para as propriedades de refletância do material no modo de índice de cores. no modo de índice de cores.

glLightModelfv(GL_LIGHT_MODEL_AMBIENT, glLightModelfv(GL_LIGHT_MODEL_AMBIENT, luzAmbiente);luzAmbiente); estabelece os parâmetros do modelo de estabelece os parâmetros do modelo de iluminação usado por OpenGL. É possível especificar iluminação usado por OpenGL. É possível especificar um, ou todos os três modelos:um, ou todos os três modelos:

- GL_LIGHT_MODEL_AMBIENT é usado para - GL_LIGHT_MODEL_AMBIENT é usado para especificar a luz ambiente especificar a luz ambiente defaultdefault para uma cena, que para uma cena, que tem um valor RGBA tem um valor RGBA defaultdefault de (0.2, 0.2, 0.2, 1.0); de (0.2, 0.2, 0.2, 1.0);

- GL_LIGHT_MODEL_TWO_SIDE é usado para indicar - GL_LIGHT_MODEL_TWO_SIDE é usado para indicar se ambos os lados de um polígono são iluminados (por se ambos os lados de um polígono são iluminados (por defaultdefault apenas o lado frontal é iluminado); apenas o lado frontal é iluminado);

- GL_LIGHT_MODEL_LOCAL_VIEWER modifica o - GL_LIGHT_MODEL_LOCAL_VIEWER modifica o cálculo dos ângulos de reflexão especular; cálculo dos ângulos de reflexão especular;

Possui algumas variações cujos protótipos são:Possui algumas variações cujos protótipos são:

glLightModelf(GLenum pname, GLfloat param);glLightModelf(GLenum pname, GLfloat param); glLightModeli(GLenum pname, GLint param);glLightModeli(GLenum pname, GLint param); glLightModelfv(GLenum pname, const GLfloat glLightModelfv(GLenum pname, const GLfloat *params);*params); glLightModeliv(GLenum pname, const GLint glLightModeliv(GLenum pname, const GLint *params);*params);

Descrição dos parâmetros: Descrição dos parâmetros: pnamepname especifica um parâmetro do especifica um parâmetro do modelo de iluminação: modelo de iluminação: GL_LIGHT_MODEL_AMBIENT, GL_LIGHT_MODEL_AMBIENT, GL_LIGHT_MODEL_LOCAL_VIEWER ou GL_LIGHT_MODEL_LOCAL_VIEWER ou GL_LIGHT_MODEL_TWO_SIDE; GL_LIGHT_MODEL_TWO_SIDE;

paramparam (GLfloat ou GLint) para (GLfloat ou GLint) para GL_LIGHT_MODEL_LOCAL_VIEWER um valor 0.0 GL_LIGHT_MODEL_LOCAL_VIEWER um valor 0.0 indica que os ângulos da componente especular tomam indica que os ângulos da componente especular tomam a direção de visualização como sendo paralela ao eixo a direção de visualização como sendo paralela ao eixo z, e qualquer outro valor indica que a visualização ocorre z, e qualquer outro valor indica que a visualização ocorre a partir da origem do sistema de referência da câmera; a partir da origem do sistema de referência da câmera; para GL_LIGHT_MODEL_TWO_SIDE um valor 0.0 para GL_LIGHT_MODEL_TWO_SIDE um valor 0.0 indica que somente os polígonos frontais são incluídos indica que somente os polígonos frontais são incluídos nos cálculos de iluminação, e qualquer outro valor indica nos cálculos de iluminação, e qualquer outro valor indica que todos os polígonos são incluídos nos cálculos de que todos os polígonos são incluídos nos cálculos de iluminação; iluminação; paramsparams (GLfloat* ou GLint*) para (GLfloat* ou GLint*) para GL_LIGHT_MODEL_AMBIENT ou GL_LIGHT_MODEL_AMBIENT ou GL_LIGHT_MODEL_LOCAL_VIEWER, aponta para um GL_LIGHT_MODEL_LOCAL_VIEWER, aponta para um vetor de números inteiros ou reais; para vetor de números inteiros ou reais; para GL_LIGHT_MODEL_AMBIENT o conteúdo do vetor GL_LIGHT_MODEL_AMBIENT o conteúdo do vetor indica os valores das componentes RGBA da luz indica os valores das componentes RGBA da luz ambiente. ambiente.

glLightfv(GL_LIGHT0, GL_AMBIENT, glLightfv(GL_LIGHT0, GL_AMBIENT, luzAmbiente);luzAmbiente); estabelece os parâmetros da estabelece os parâmetros da fonte de luz para uma das oito fontes de luz fonte de luz para uma das oito fontes de luz disponíveis. Possui algumas variações cujos disponíveis. Possui algumas variações cujos protótipos são: protótipos são: glLightf(GLenum light, GLenum pname, GLfloat glLightf(GLenum light, GLenum pname, GLfloat param);param); glLighti(GLenum light, GLenum pname, GLint glLighti(GLenum light, GLenum pname, GLint param);param); glLightfv(GLenum light, GLenum pname, const glLightfv(GLenum light, GLenum pname, const GLfloat *params);GLfloat *params); glLightiv(GLenum light, GLenum pname, const glLightiv(GLenum light, GLenum pname, const GLint *params);GLint *params);

As duas primeiras variações requerem apenas As duas primeiras variações requerem apenas um único valor para determinar uma das um único valor para determinar uma das seguintes propriedades: seguintes propriedades: GL_SPOT_EXPONENT, GL_SPOT_CUTOFF, GL_SPOT_EXPONENT, GL_SPOT_CUTOFF, GL_CONSTANT_ATTENUATION, GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION e GL_LINEAR_ATTENUATION e GL_QUADRATIC_ATTENUATION. As duas GL_QUADRATIC_ATTENUATION. As duas últimas variações são usadas para parâmetros últimas variações são usadas para parâmetros de luz que requerem um vetor com múltiplos de luz que requerem um vetor com múltiplos valores (GL_AMBIENT, GL_DIFFUSE, valores (GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_POSITION e GL_SPECULAR, GL_POSITION e GL_SPOT_DIRECTION). GL_SPOT_DIRECTION).

Descrição dos parâmetros: Descrição dos parâmetros: lightlight especifica qual fonte de luz está sendo especifica qual fonte de luz está sendo alterada (varia de 0 a GL_MAX_LIGHTS); alterada (varia de 0 a GL_MAX_LIGHTS); valores constantes de luz são enumerados de valores constantes de luz são enumerados de GL_LIGHT0 a GL_LIGHT7 GL_LIGHT0 a GL_LIGHT7 pnamepname especifica qual parâmetro de luz está especifica qual parâmetro de luz está sendo determinado pela chamada desta função sendo determinado pela chamada desta função (GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, (GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_POSITION, GL_SPOT_DIRECTION, GL_POSITION, GL_SPOT_DIRECTION, GL_SPOT_EXPONENT, GL_SPOT_CUTOFF. GL_SPOT_EXPONENT, GL_SPOT_CUTOFF. GL_CONSTANT_ATTENUATION, GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION); GL_QUADRATIC_ATTENUATION);

paramparam (GLfloat ou GLint) para parâmetros que são (GLfloat ou GLint) para parâmetros que são especificados por um único valor (especificados por um único valor (paramparam); estes ); estes parâmetros, válidos somente para parâmetros, válidos somente para spotlightsspotlights, , são GL_SPOT_EXPONENT, são GL_SPOT_EXPONENT, GL_SPOT_CUTOFF, GL_SPOT_CUTOFF, GL_CONSTANT_ATTENUATION, GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION e GL_LINEAR_ATTENUATION e GL_QUADRATIC_ATTENUATION. GL_QUADRATIC_ATTENUATION. paramsparams (GLfloat* ou GLint*) um vetor de valores (GLfloat* ou GLint*) um vetor de valores que descrevem os parâmetros que estão sendo que descrevem os parâmetros que estão sendo especificados.especificados.

glEnable(GL_COLOR_MATERIAL);glEnable(GL_COLOR_MATERIAL); a a função função glEnableglEnable é usada para habilitar é usada para habilitar uma variável de estado OpenGL. Neste uma variável de estado OpenGL. Neste caso, estão sendo habilitadas: caso, estão sendo habilitadas: GL_COLOR_MATERIAL (atribui a cor GL_COLOR_MATERIAL (atribui a cor para o material a partir da cor corrente), para o material a partir da cor corrente), GL_DEPTH_TEST (controla as GL_DEPTH_TEST (controla as comparações de profundidade e atualiza o comparações de profundidade e atualiza o depth bufferdepth buffer), GL_LIGHTING (habilita a ), GL_LIGHTING (habilita a iluminação) e GL_LIGHT0 (habilita a luz iluminação) e GL_LIGHT0 (habilita a luz de número 0). de número 0).