Material de Auxílio Didático
EA978 - Sistemas de informações gráficas
Primeiro semestre de 2003
1o Projeto
Atividade 5 - Iluminação
Objetivo: Visualizar a cena com polígonos preenchidos, com iluminação de uma fonte de luz pontual, fonte de luz spot (spotlight), tonalização constante, tonalização Gouraud e definir as propriedades dos materiais.
Iluminação com fonte de luz pontual
Use o seguinte esqueleto de código para implementar essa tarefa:
pointlight.c
Veja também as demonstrações didáticas dessa tarefa.
Modifique o programa da primeira atividade de modo que os objetos mostrados em wireframe sejam visualizados como polígonos preenchidos. Para isso use o comando glPolygonMode(GL_FRONT_AND_BACK, GL_FILL). Além disso, troque todos os comando da GLUT que contém a palavra Wire por Solid. Por exemplo, glutWireCube() deve ser alterado para glutSolidCube() e assim por diante. A cena visualizada deverá ficar parecida com a figura mostrada abaixo.
Cena visualizada com polígonos preenchidos.
Para que os objetos possam ser distinguidos uns dos outros é necessário ativar o suporte à iluminação do OpenGL chamando o comando glEnable(GL_LIGHTING) e adicionar pelo menos uma fonte de luz na cena. Por enquanto adicione apenas uma fonte de luz pontual acima da mesa, próxima do observador, como mostra a imagem abaixo. Para que ambos os lados de cada primitiva sejam iluminados, chame o comando glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE).
Uma vez definida a iluminação, habilite o método de tonalização através do comando glShadeModel. Apenas para efeito de comparação, utilize inicialmente o modelo de tonalização constante (GL_FLAT). A imagem resultante ficará parecida com essa:
Cena com uma fonte de luz e tonalização constante.
Observe que, na cena anterior, o tampo da mesa parece ser composto por uma
malha de pequenos triângulos. De fato, na cena acima foi empregado o mesmo
código utilizado na modelagem do chão para refinar a geometria da mesa e gerar o
efeito de degradé. Em especial, essa malha foi colocada sobre a mesa como se
fosse uma toalha. Sem esse refinamento, o tampo da mesa seria mostrado com
apenas uma cor. Modifique seu programa de modo a incorporar esse refinamento.
Partindo do código da cena anterior, utilize o modelo de tonalização Gouraud
passando o parâmetro GL_SMOOTH em glShadeModel. Compare as duas cenas.
Cena com uma fonte de luz e tonalização Gouraud.
Observação:
Até agora não havia necessidade de utilizar o buffer de profundidade (z-buffer),
uma vez que a ordem de renderização dos objetos desenhados em wireframe
era irrelevante. Como dessa vez estamos visualizando uma cena tonalizada, é
importante que o z-buffer esteja habilitado. Para isso adicione a constante
GL_DEPTH em glutInitDisplayMode e habilite o teste de z-buffering com glEnable(GL_DEPTH_TEST).
Além disso, adicione a constante GL_DEPTH_BUFFER_BIT em glClear. A figura abaixo
mostra o que poderia acontecer se o buffer de profundidade não estivesse
devidamente habilitado:
Cena renderizada sem z-buffering.
Iluminação com fonte de luz spot (spotlight)
Adicione uma fonte de luz to tipo spot à cena da tarefa anterior. A fonte de luz deve ser posicionada no centro da esfera que representa a lâmpada da luminária sobre a mesa. Direcione a luz para o centro da mesa com um ângulo de abertura focal de 45 graus. Experimente diferentes tipos de atenuação até obter um resultado satisfatório. O efeito de iluminação da luz spot é mostrado na figura abaixo.
Cena visualizada com uma fonte de luz pontual e uma luz spot.
Observe que a transição entre a parte iluminada pela fonte de luz pontual para a parte iluminada pela luz spot apresenta um efeito de serrilhado. Modifique o refinamento da malha que define o chão e o tampo da mesa e observe como esse efeito depende da resolução da grade. Observe também que a luz spot ilumina incorretamente a parte do chão que está embaixo da mesa. Por que ocorre esse efeito? O que poderia ser feito para consertar esse problema?
Propriedade dos materiais
A definição das propriedades dos materiais permite que o usuário escolha como a luz deve interagir com as superfícies do ambiente. Na cena trabalhada até aqui, as propriedades dos materiais foram determinadas unicamente pelas configurações default do OpenGL. Com a definição de novas propriedades é possível adicionar maior grau de realismo à cena. No OpenGL a configuração das propriedades pode ser feita nas componentes de reflexão de luz difusa, especular, ambiente e emissiva de cada material.
Utilize o comando glMaterial* para definir as propriedades dos materiais da cena. Utilize a constante GL_FRONT_AND_BACK no primeiro parâmetro para que as propriedades sejam aplicadas nos dois lados de cada polígono. Use pelo menos três tipos diferentes de materiais como mostra a imagem seguinte (um para a o chão e as cadeiras, outro para a mesa, cálice e luminária e outro para o vaso). Além disso aplique um quarto material de elevada componente emissiva na esfera que representa a lâmpada da luminária.
Observação: os vetores de descrição da cor de reflexão difusa, especular, ambiente, etc, são compostos por quatro valores, como em GLfloat diffuse[] = { 1.0, 0.5, 0.5, 0.5 }. Para que a cena seja restrita a tons de cinza, mantenha a componente inicial em 1.0 e as componentes restantes com um mesmo valor (como 0.5 do exemplo anterior).
Cena com propriedades dos materiais.
Um programa que demonstra como diferentes tipos de materiais podem ser definidos com glMaterial* está disponível em matgray.c. Para gerar o executável digite make matgray (o arquivo makefile é o mesmo utilizado nas demonstrações didáticas). Esse programa gera a figura abaixo composta por duas fileiras de esferas. Na primeira linha as esferas são desenhadas com diferentes tipos de materiais sem reflexão ambiente. A segunda linha é uma cópia da primeira, mas com reflexão ambiente. A primeira coluna só contém a componente de reflexão difusa. A segunda coluna contém reflexão difusa e especular com baixo expoente de brilho. A terceira coluna contém a componente de reflexão difusa e especular com alto expoente de brilho (observe o brilho mais concentrado em comparação com a segunda coluna). A quarta coluna inclui materiais com reflexão difusa e uma componente de luz emissiva.
Diferentes tipos de materiais.
As demonstrações didáticas abaixo relacionadas auxiliam o aluno na
compreensão dos conceitos básicos de OpenGL necessários para a implementação
dessa atividade. Para compilar esses programas nas
máquinas do laboratório LE-20, use o seguinte arquivo makefile.
Adicione esse arquivo no mesmo diretório onde estão os programas com extensão
.c de cada demonstração. Para compilar todas as demonstrações, digite "make
all" na linha de comando. Para compilar uma demonstração em
particular, execute o comando "make"
com o parâmetro indicado em cada descrição do programa.
![]() |
Iluminação
[light.c] Demonstração do modelo de iluminação local do OpenGL. Uma esfera cinza é desenhada e uma única fonte de luz direcional é utilizada para iluminar o objeto. Os conceitos básicos de definição de vetores normais, tipos de fontes de luz e propriedades dos materiais são explorados nesse programa. Para gerar o executável digite make light. Referência: Capítulo 6 do OpenGL Programming Guide (Listagem 6.1). Sugestão: Mude a luz direcional para uma luz pontual, isto é, use uma fonte de luz que é descrita por uma posição ao invés de uma direção. Adicione também uma fonte de luz do tipo spot (spotlight). |
![]() |
Movendo a fonte de luz [movelight.c] Mostra como uma transformação geométrica pode ser utilizada para rotacionar uma fonte de luz ao redor de um objeto. Um toróide cinza é desenhado e uma fonte de luz representada por um cubo pode ser rotacionado em torno do objeto quando o botão esquerdo do mouse é pressionado. Para gerar o executável digite make movelight. Referência: Capítulo 6 do OpenGL Programming Guide (Listagem 6.2). Sugestão: Faça a luz transladar por entre o objeto ao invés de rotacionar. Para isso basta usar glTranslate ao invés de glRotate na função display(). |
![]() |
[Tutorial OpenGL - Fonte
de Luz] Executável Windows Demonstra como a posição da fonte de luz é afetada pela transformação de visão em OpenGL. A ordem na qual a posição de luz e a transformação de visão são efetuadas é configurável, bem como os parâmetros para a posição e transformação. |
Autor: Harlen Costa Batagelo (harlen@dca.fee.unicamp.br)