9.2 Modelo de reflexão de Phong
O modelo de reflexão de Phong (Phong 1973) é um modelo de iluminação local que modela de forma empírica a quantidade de luz refletida de um ponto P de uma superfície em uma direção ˆv até a câmera. O modelo não é fisicamente correto e, por exemplo, não respeita a lei de conservação de energia. Entretanto, produz resultantes suficientemente adequados para produzir a percepção de objetos iluminados. Além disso, é muito eficiente.
A figura 9.5 ilustra a geometria do modelo de reflexão de Phong considerando apenas uma fonte de luz.
Figura 9.5: Geometria do modelo de reflexão de Phong.
Nessa figura, P é o ponto de uma superfície, e ˆn é o vetor normal unitário correspondente.
A luz que incide sobre P vem de uma direção −ˆl, onde
ˆl=L−P|L−P|
é o vetor que vai de P até a fonte de luz situada em um ponto L, mas normalizado para se transformar em um vetor unitário.
Parte da luz incidente em P é refletida na direção do vetor
ˆv=E−P|E−P|,
que é o vetor normalizado de P até a câmera posicionada em um ponto E.
A intensidade da luz refletida na direção ˆv é calculada como a soma de três componentes de reflexão: ambiente (Ia), difusa (Id) e especular (Is):
I=Ia+Id+Is.
A figura 9.6 mostra um exemplo da contribuição de cada componente para a formação da renderização do modelo Stanford Bunny.
Figura 9.6: Soma das componentes de reflexão ambiente, difusa e especular.
Nessa imagem, o coelho está centralizado na origem do espaço do mundo. A câmera está em E=(0,0,2) olhando da direção de z negativo, e a fonte de luz está localizada em L=(100,100,100) (acima, à direita e à frente do coelho).
O aspecto de material feito de plástico é característico de superfícies iluminadas com o modelo de reflexão de Phong.
Em geral, uma cena possui mais de uma fonte de luz. Nesse caso, as componentes Id e Is devem ser calculadas para cada fonte de luz e então somadas. Se a cena tiver m fontes de luz (figura 9.7), então a reflexão deverá ser calculada como
I=Ia+m∑i=1(Idi+Isi).
Figura 9.7: Geometria do modelo de reflexão de Phong para a interação com várias fontes de luz.
A seguir, detalharemos as componentes de reflexão ambiente, difusa e especular.
Reflexão ambiente
A componente de reflexão ambiente é uma constante que procura aproximar a iluminação indireta resultante das interreflexões de luz entre as superfícies. A componente não depende da posição de P, da posição da câmera E ou das fontes de luz L1,L2,…,Lm, e é computada simplesmente como
Ia=κaιa,
onde
- κa é a constante de reflexão ambiente que determina o quanto o material reflete a luz ambiente.
- ιa é a intensidade de luz ambiente incidente em P.
Uma vez que Ia é constante para todos os pontos de um objeto, esse valor pode ser pré-calculado e reutilizado em todos os pontos.
Na maioria das aplicações, Ia é um valor bastante baixo. A figura 9.8 mostra o resultado da renderização usando apenas a componente de reflexão ambiente, com κa=0.1 e ιa=1.0. O objeto é desenhado com um tom de cinza, que neste caso é a cor RGB (0.1,0.1,0.1), isto é, cada componente de cor é o próprio valor Ia.
Figura 9.8: Renderização usando apenas a componente ambiente.
Mais adiante descreveremos como estender o cálculo de reflexão para gerar cores em vez de tons de cinza.
Reflexão difusa
A componente de reflexão difusa Id representa a luz que é refletida supondo que P faz parte de uma superfície difusa ideal, também chamada de superfície lambertiana em homenagem ao matemático e físico suíço Johann Heinrich Lambert (1728–1777), que introduziu tal conceito.
Não há superfícies idealmente difusas no mundo físico. Entretanto, aproximações incluem, por exemplo, paredes de gesso e argamassa, e superfícies em geral que possuem aspecto fosco. Superfícies difusas são aquelas que não possuem brilho especular.
Em uma superfície lambertiana, a luz que incide sobre P é refletida igualmente em todas as direções, como ilustra a figura 9.9.
Figura 9.9: Reflexão difusa ideal.
A intensidade da luz refletida é proporcional ao cosseno do ângulo entre ˆl e ˆn (relação chamada de lei do cosseno de Lambert), que é o mesmo que o produto escalar entre os vetores unitários:
cosθ=ˆl⋅ˆn.
Observe que esse valor é também a projeção escalar de ˆl sobre ˆn.
Quanto maior o ângulo entre ˆl e ˆn, menor a intensidade da reflexão difusa. A intensidade é mínima quando os vetores são perpendiculares, pois cos(π/2)=0, e máxima quando paralelos, pois cos(0)=1. Isso ocorre porque a energia luminosa que incide sobre uma área da superfície é mais concentrada quanto mais perpendicular a luz estiver em relação à superfície (figura 9.10).
Figura 9.10: A concentração da luz em uma superfície depende da orientação da luz em relação à superfície.
Esse fator de atenuação da reflexão da luz está presente na equação de renderização, através do termo cosθi da integral:
I(x,ωo)=Ie(x,ωo) +∫Ωfr(ωi,ωo)I(x,ωi)cosθidωi.
Em uma superfície idealmente difusa, a BRDF é uma constante, isto é, fr(ωi,ωo)=κd. Logo, a equação de renderização torna-se
I(x,ωo)=Ie(x,ωo) +∫ΩκdI(x,ωi)cosθidωi=Ie(x,ωo) +κd∫ΩI(x,ωi)cosθidωi.
O modelo de reflexão de Phong aproxima isso calculando a componente difusa como
Id=κdιd(ˆl⋅ˆn),
onde
- κd é a constante de reflexão difusa que determina o quanto o material reflete a luz difusa.
- ιd é a intensidade de luz difusa incidente em P.
- ˆl⋅ˆn é o fator de atenuação relacionado à lei de cosseno de Lambert. São válidos apenas os valores no intervalo [0,1].
A figura 9.11 mostra o resultado da renderização usando apenas a componente de reflexão difusa, com κd=0.7 e ιd=1.0.
Figura 9.11: Renderização usando apenas a componente difusa.
Se tivermos m>1 fontes de luz, cada fonte de luz terá seu próprio vetor ˆl e sua própria intensidade ιd. A componente Id deverá levar em conta a soma de todas essas intensidades:
Id=κdm∑i=1ιdi(ˆli⋅ˆn).
Note a semelhança entre Id e a integral da equação de renderização com BRDF constante:
κdm∑i=1ιdi(ˆli⋅ˆn)≈κd∫ΩI(x,ωi)cosθidωi.
- A integral é substituída pelo somatório, pois as fontes de luz podem ser consideradas como pontos discretos no espaço;
- ιdi é uma aproximação de I(x,ωi) para a incidência da luz da i-ésima fonte de luz;
- ˆli⋅ˆn é cosθi.
Note também que Id não usa o vetor ˆv, que é o vetor de direção até a câmera. Isso significa que a componente de reflexão difusa não depende da posição da câmera.
Se a cena é estática, isto é, se os objetos e as fontes de luz não se movem, a componente de reflexão difusa de cada ponto pode ser pré-calculada. Essa característica é explorada na técnica de radiosidade (Greenberg, Cohen, and Torrance 1986). A técnica considera que todas as superfícies da cena são lambertianas. Desse modo, a solução da equação de renderização pode ser pré-computada e a intensidade de reflexão difusa pode ser gravada como a “cor” de cada vértice. A cena pode então ser visualizada por uma câmera LookAt em tempo real.
Reflexão especular
Uma superfície idealmente especular é um espelho ideal. A luz que incide em P é refletida apenas na direção reflexa ˆr do vetor ˆl em torno de ˆn, como mostra a figura 9.12.
Figura 9.12: Reflexão especular ideal.
O vetor ˆr de reflexão ideal é calculado como
ˆr=2(ˆl⋅ˆn)ˆn−ˆl.
A figura 9.13 mostra uma interpretação geométrica desssa expressão.
Figura 9.13: Calculando o vetor de reflexão especular.
No modelo de reflexão de Phong, a reflexão especular Is é um valor que varia de acordo com o ângulo formado entre ˆr e ˆv:
Is=κsιs(ˆr⋅ˆv)α,
onde
κs é a constante de reflexão especular que determina o quanto o material reflete a luz especular.
ιs é a intensidade de luz especular incidente em P.
α≥0 é uma constante que determina o espalhamento do brilho especular. É uma propriedade do material.
Quanto maior é o valor de α, mais concentrado será o brilho especular. Desse modo, α define o quão “lustro” é o material. Se α=∞, o resultado é um superfície especular ideal (espelho ideal).
ˆr⋅ˆv é o cosseno do ângulo entre ˆr e ˆv. São válidos apenas os valores no intervalo [0,1].
O brilho especular é máximo (ˆr⋅ˆv=1) se ˆr=ˆv.
O brilho especular é mínimo (ˆr⋅ˆv=0) se ˆr e ˆv são perpendiculares.
A figura 9.14 mostra o resultado da variação do brilho especular para diferentes valores de α e ilustra a variação correspondente de ˆr⋅ˆv. As renderizações consideram os valores de intensidade ambiente e difusa mostrados nas figuras 9.8 e 9.11.
Figura 9.14: Renderização usando diferentes valores de brilho especular.
A figura 9.15 mostra o resultado da renderização usando apenas a componente de reflexão especular, com κs=0.7 e ιs=1.0 e α=50.
Figura 9.15: Renderização usando apenas a componente especular.
Se tivermos m>1 fontes de luz, cada fonte de luz terá seu próprio vetor ˆr e sua própria intensidade ιs. A componente Is deverá levar em conta a soma de todas essas intensidades:
Is=κsm∑i=1ιsi(ˆri⋅ˆv)α.
Modelo completo
Combinando as componentes ambiente, difusa e especular, temos a equação completa
I=κaιa+m∑i=1(κdιdi(ˆli⋅ˆn)+κsιsi(ˆri⋅ˆv)α).
A equação pode ser avaliada em um vertex shader ou fragment shader, pois podemos armazenar as seguintes informações como variáveis uniformes (uniform):
- α (constante de espalhamento de brilho especular).
- m (número de fontes de luz).
- κa, κd, κs (coeficientes de reflexão do material).
- ιa, ιd, ιs (intensidades de luz, em um arranjo de m elementos, um para cada fonte de luz).
Além disso, ˆn pode ser pré-calculado como um atributo do vértice, isto é, como um VBO de vetores normais de vértices.
Podemos calcular ˆl como
ˆl=L−P|L−P|,
onde L é a posição da fonte de luz, que também pode ser armazenada como uma variável uniforme, e P é o atributo de posição do vértice atual (caso a equação seja avaliada no vertex shader) ou fragmento atual (caso a equação seja avaliada no fragment shader).
Podemos calcular ˆv como
ˆv=E−P|E−P|, onde E é a posição da câmera. Se considerarmos que P está no espaço da câmera, então a posição da câmera é a origem:
E=(0,0,0) e assim não é necessário enviar E ao shader como uma variável uniforme.
Como já vimos, ˆr pode ser calculado como
ˆr=2(ˆl⋅ˆn)ˆn−ˆl.
Enfim, temos tudo o que é preciso para implementar o modelo de reflexão de Phong no pipeline gráfico. Faremos isso em um passo a passo de implementação nas seções 9.5 e 9.6.
Iluminação colorida
Até agora só consideramos fontes de luz e materiais monocromáticos. Se quisermos representar fontes de luz coloridas ou materiais coloridos, devemos calcular I para cada uma das componentes RGB. Assim, as constantes de material (κa, κd, κs) e as intensidades (ιa, ιd, ιs) de cada fonte de luz deverão ser tuplas de três elementos:
κa=(κa,r,κa,g,κa,b),κd=(κd,r,κd,g,κd,b),κs=(κs,r,κs,g,κs,b),
e
ιa=(ιa,r,ιa,g,ιa,b),ιd=(ιd,r,ιd,g,ιd,b),ιs=(ιs,r,ιs,g,ιs,b).
Os elementos dessas tuplas correspondem a cores RGB. Por exemplo, um objeto de cor vermelha poderá ser especificado com um material com constante de reflexão difusa
κd=(1,0,0).
Isso significa que o material reflete toda luz vermelha (κd,r=1) e absorve completamente as outras cores (κd,g=κd,b=0) das fontes de luz.
Alguns exemplos de materiais são mostrados na figura 9.16. Todos esses materiais estão sendo iluminados por uma fonte de luz branca, isto é, ιa=ιd=ιs=(1,1,1).
Figura 9.16: Diferentes materiais no modelo de Phong.
Como regra geral, se o material não é um metal, κs deve ter o mesmo valor para cada componente RGB, pois a cor do brilho especular deve ser a cor da fonte de luz. Se o material é um metal, κs deve ser a cor do material. Por exemplo, em um objeto feito de ouro, a cor especular deve ser amarelada.
A cor de uma fonte de luz pode ser especificada através da intensidade de luz difusa. Por exemplo, uma luz verde é definida com
ιd=(0,1,0).
Suponha que a luz verde ilumine um material vermelho com κd=(1,0,0). O resultado de κdιd (multiplicação elemento a elemento) será a cor preta
κdιd=(0,0,0).
Isso faz sentido pois, de fato, um objeto vermelho têm a aparência de um objeto preto quanto iluminado por uma luz verde.
Fontes de luz
Até agora, consideramos que cada fonte de luz do modelo de reflexão de Phong é um ponto L no espaço. Essa é a definição de uma fonte de luz pontual.
Além da luz pontual, também é comum o uso de luz direcional. A seguir, definiremos a luz direcional e revisitaremos a definição de luz pontual com a introdução do conceito adicional de atenuação espacial.
Luz pontual
Uma fonte de luz pontual é definida por um ponto que emite luz em igual intensidade em todas as direções, como uma lâmpada tradicional de bulbo.
Se L é a posição da luz, então o vetor ˆl do modelo de reflexão é definido como
ˆl=L−P|L−P|.
Podemos simular um efeito de atenuação da luz, isto é, diminuição da intensidade da fonte de luz de acordo com a distância do ponto L em relação ao ponto P.
As intensidades que devem ser atenuadas são as contantes ιd (intensidade difusa) e ιs (intensidade especular). Opcionalmente, podemos atenuar ιa (intensidade ambiente) caso consideremos que a fonte de luz em questão contribui para a intensidade ambiente.
No mundo real, a intensidade luminosa é proporcional ao inverso da distância ao quadrado. Entretanto, podemos obter um maior controle artístico se considerarmos que o fator de atenuação é definido de forma mais geral como:
Fatt=1kc+kld+kqd2.
onde
- d é a distância, isto é, |L−P|.
- kc, kl e kq são, respectivamente, os termos constante, linear e quadrático da atenuação. Esses valores devem estar no intervalo [0,1].
Em geral, kc=1 para evitar que o valor de atenuação seja maior que 1.
Geralmente, kl≤1 e kq≤1, mas a escolha dos valores dependerá do efeito desejado. Um bom ponto de partida é começar com kl=kq=0.2. Isso faz com que a fonte de luz ilumine objetos até aproximadamente d=20. Quanto menor o valor de kl e kq, maior a distância coberta pela fonte de luz.
Se considerarmos que todas as fontes de luz são pontuais e atenuadas, podemos reformular o modelo de reflexão como a seguir:
I=m∑i=1Fatti(κaιam+κdιdi(ˆli⋅ˆn)+κsιsi(ˆri⋅ˆv)α),
onde Fatti é o fator de atenuação da i-ésima fonte de luz. Note que o termo κaιa é atenuado for Fatti/m. Isso supõe que todas as fontes de luz contribuem igualmente para a intensidade ιa.
Luz direcional
A fonte de luz direcional simula o comportamento de uma fonte de luz pontual infinitamente distante, de tal modo que os raios de luz que chegam à superfície são paralelos entre si. No mundo físico, uma aproximação de fonte de luz direcional é a luz do sol.
A luz direcional é definida simplesmente por um vetor u de direção da luz. Não há posição do espaço, logo não há como calcular a atenuação.
Dada uma direção u de luz direcional, o vetor ˆl do modelo de reflexão de Phong é definido como
ˆl=−u|u|.