Jonh Edson Ribeiro de Carvalho | IC-UFFComputação Visual e Interfaces |
|||||||||||||||
|
|||||||||||||||
Tutorial OpenGL | |||||||||||||||
Capítulo 9. Modelos de iluminação e sombreamento
O propósito desta lição é ilustrar para o usuário os principais conceitos envolvidos na iluminação de uma cena e na definição das propriedades luminosas de um material, geralmente representadas pelos coeficientes de reflexão difusa e especular. Será mostrado com definir características básicas de uma fonte de luz, tais como a intensidade da luz gerada, para as componentes de luz ambiente, difusa e especular (no OpenGL, é possível separar as contribuições). Além disso, será mostrado também o uso do canal alfa para geração de transparências e a construção de spots de luz. A cena gerada pelo programa utilizado nesta lição é mostrado na Figura 9-1. Consiste de duas esferas (nomeadas A e B) sob um plano. A esfera "A" é sólida, e os valores das suas constantes de reflexão difusa e especular pode ser modificados através de seleção de opções em um menu. A esfera "B" é translúcida, e sua translucidez pode ser ajustada através do canal alfa. Até o momento, o canal alfa tem sido ignorado (alfa é o A em RGBA). Os valores do canal alfa variam de 0 a 1, e são especificados com as funções glColor*(). Quando os efeitos de composição (blending) são utilizados, o valor de alfa é utilizado para combinar a cor do fragmento que está sendo processado com a cor já presente no framebuffer. De modo geral, a composição de imagens utilando o canal alfa é dada pela seguinte expressão:
onde: IT é a imagem total resultante, IP é a imagem que está sendo processada, e IFB é a imagem anteriormente presente no framebuffer. O programa usado para modelar esta cena é mostrado no Exemplo 9-1. As teclas LEFT e RIGHT servem para rotacionar a posição do observador em torno do eixo y contra e a favor do sentido dos ponteiros do relógio, respectivamente. A distância entre o observador e o centro de rotação (raio de observação) é alterado pelas teclas r e R, que aumentam o diminuem o seu valor, respectivamente. As teclas UP e DOWN, controlam a altitude do observador (no eixo y). É possível modificar os graus de reflexão difusa e especular da esfera maciça através do menu popup disponível pelo pressionamento do botão direito do mouse. A tecla t habilita ou desabilita o uso de texturas. Para finalizar o programa, basta digitar ESC. Exemplo 9-1. programa iluminacao.c
Para compilar e executar o programa iluminacao.c, salve-o juntamente com o arquivo Makefile em um diretório e execute a seguinte seqüência de comandos:
9.1. Descrição do programa iluminacao.c
Define o número de fatias (longitude), o número de pilhas (latitude) e o raio das esferas da cena.
Define os coeficientes de reflexão difusa (*_difusa) e especular (*_especular) para os três objetos da cena. As componentes destes vetores são do tipo R,G,B e A(lfa) e serão utilizados para as compor cores do plano, da esfera A e da esfera B. Observe que a esfera B possui valor de alfa igual a 0.5, proporcionando assim a sua aparência translúcida. O brilho do material, que pode assumir valores entre 1 e 128, é um expoente que modela a função de distribuição espacial da componente de luz refletida especularmente. À medida em que o valor do brilho aumenta, diminui o espalhamento da luz refletida.
Indica a posição (posicao_luz0) e as componentes de luz para reflexão difusa e especular (cor_luz0), e a componente de luz para reflexão ambiente (cor_luz0_amb).
É apresentado aqui o exemplo de uma luz tipo spot. É necessário que seja definidos, além da cor da luz e da posição do spot, a sua orientação e o seu ângulo de corte, mostrado na Figura 9-2. Para este exemplo, o ângulo de corte é igual a 30 graus.
Através da variável gouraud a função display decide se o modelo de sombreamento (shading) para os objetos será o de Gouraud (GL_SMOOTH) ou flat shading, tornando os objetos com aparência faceteada.
A função glMaterialfv() define as propriedades de reflexão difusa e especular, e brilho do material que será utilizado para compor o objeto imediatamente desenhado, neste caso um plano, via GL_QUADS. Observer a chamada à função glNormal3f() antes de o plano ser desenhado. Isto é necessário porque, por default, o vetor normal encontra-se na direção (x,y,z)=(0,0,1) e para que a normal à superfície encontra-se orientada com eixo y, ou seja, na direção (x,y,z)=(0,1,0). Um procedimento semelhante a esse é utilizado para definir as características do material das esferas presentes na cena.
Para facilitar a identificação das fontes de luz, são desenhadas duas esferas nas posições destas fontes. Na chamada à função glMaterialfv(), o parâmetro GL_EMISSION define a intensidade luminosa emitida pelo material como sendo a própria cor da fonte de luz, dando a aparência de que a esfera brilha, assim como brilharia uma lâmpada.
Habilita a composição (blending) de imagens dos valores RGBA correntes com aqueles presentes no framebuffer. A função glBlendFunc() define os pesos para a imagem que está sendo processada (IP) e a presente no framebuffer. Neste caso, os pesos são o próprio valor do canal alfa (GL_SRC_ALPHA) e 1-alfa (GL_ONE_MINUS_SRC_ALPHA).
Define a posição e as componentes de cor da fonte de luz GL_LIGHT0.
Define a posição, orientação, ângulo de corte e as componentes de cor para a fonte de luz GL_LIGHT1.
A função menu é ativada quando o botão direito do mouse é pressionado. De acordo com o valor da variável value, determinadas propriedades do material que compõe a esfera A são modificadas.
Aqui, a função glutCreateMenu(), em conjunto com a função glutAddMenuEntry(), habilita um menu popup com seis opções que permitirão ativar entradas presentes na função menu, de acordo com os valores passados nos segundos argumentos das funções glutAddMenuEntry(). Finalmente, a função glutAttachMenu() associa o aparecimento deste menu ao pressionamento do botão direito do mouse. |
|||||||||||||||
CopyLeft Webmaster |Atualizado em 22/11/2003 | |||||||||||||||
Contato Pesquisas e Projetos Publicações Home |