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.

Geometria do modelo de reflexão de Phong.

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^=LP|LP|

é 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^=EP|EP|,

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.

Soma das componentes de reflexão ambiente, difusa e especular.

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+i=1m(Idi+Isi).

Geometria do modelo de reflexão de Phong para a interação com várias fontes de luz.

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.

Renderização usando apenas a componente ambiente.

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.

Reflexão difusa ideal.

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).

A concentração da luz em uma superfície depende da orientação da luz em relação à superfície.

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.

Renderização usando apenas a componente difusa.

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=κdi=1mιdi(l^in^).

Observação
  • Note a semelhança entre Id e a integral da equação de renderização com BRDF constante:

    κdi=1mιdi(l^in^)κ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;
    • l^in^ é 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.

Reflexão especular ideal.

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.

Calculando o vetor de reflexão especular.

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.

Renderização usando diferentes valores de brilho especular.

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.

Renderização usando apenas a componente especular.

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=κsi=1mιsi(r^iv^)α.

Modelo completo

Combinando as componentes ambiente, difusa e especular, temos a equação completa

I=κaιa+i=1m(κdιdi(l^in^)+κsιsi(r^iv^)α).

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^=LP|LP|,

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^=EP|EP|, 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).

Diferentes materiais no modelo de Phong.

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^=LP|LP|.

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 é, |LP|.
  • 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, kl1 e kq1, 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=i=1mFatti(κaιam+κdιdi(l^in^)+κsιsi(r^iv^)α),

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|.

Referências

Greenberg, Donald P., Michael F. Cohen, and Kenneth E. Torrance. 1986. “Radiosity: A Method for Computing Global Illumination.” The Visual Computer 2 (5): 291–97. https://doi.org/10.1007/BF02020429.
Phong, Bui Tuong. 1973. “Illumination of Computer-Generated Images.” Technical Report UTEC-CSs-73-129. University of Utah.