17. Mais sobre Iluminação e Sombreamento

Na aula passada introduzimos as componentes do modelo de reflexão de Phong. Nessa aula vamos descrever como calcular e combinar essas componentes para criar uma imagem mais realista com efeitos de iluminação criados por esse modelo.

17.1. Vetores usados no modelo

O sombreamento de um ponto em uma superfície é uma função da relação entre o observador, as fontes de luz e a superfície. Lembre-se que, por se tratar de um modelo de iluminação local, os outros objetos da cena são ignorados.

Para determinar a cor resultante da iluminação e sombreamento em um ponto \(P\), iluminado por uma fonte de luz em \(Q\), vamos considerar os seguintes vetores, como ilustrado na Figura Fig. 17.1 a. Para simplificar a descrição desses vetores, vamos considerar que todos possuem comprimento unitário.

Vetores usados para calcular as reflexões do modelo de Phong.

Fig. 17.1 Vetores usados para calcular as reflexões do modelo de Phong.

  • Vetor normal

    um vetor \(\vec{n}\) perpendicular à superfície e direcionado para fora do objeto. Existem várias maneiras de calcular vetores normais, dependendo da representação do objeto subjacente. Como no WebGL usamos basicamente triângulos, o seguinte método é suficiente. Dados quaisquer três pontos não colineares, \(P0\), \(P1\) e \(P2\) de um triângulo, podemos calcular a normal como um produto vetorial de dois dos vetores associados.

    \(\vec{n} = normalize( (P1-P0) \times (P2-P0))\).

    O vetor resultante apontará para fora se a tripla (\(P0, P1, P2\)) estiverem ordenados no sentido anti-horário quando vistos de fora.

  • Vetor vista

    um vetor \(\vec{v}\) que aponta para a câmera ou observador.

  • Vetor luz

    um vetor \(\vec{l}\) que aponta para a fonte de luz.

  • Vetor de reflexão

    um vetor \(\vec{r}\) que aponta na direção da reflexão da luz incidente. Lembre-se da regra que o ângulo de incidência com a normal deve ser o mesmo que o do raio refletido com a normal.

    O cálculo de \(\vec{r}\) é um bom exercício de aritmética vetorial e está ilustrado na Figura Fig. 17.1 b. Primeiro, vamos decompor o vetor luz \(\vec{l}\) em duas partes: uma paralela e outra ortogonal a \(\vec{n}\):

    \(\vec{l}= \vec{l}_p + \vec{l}_o\;\;\;\) onde \(\;\;\; \vec{l}_p= ( \vec{n} \cdot \vec{l} ) \vec{n}\;\;\;\) e \(\;\;\; \vec{l}_o = \vec{l}-\vec{l}_p\).

    O vetor de reflexão pode ser calculado subtraindo \(\vec{l}_o\) de \(\vec{l}_p\) tal que:

    \(\vec{r} = \vec{l}_p - \vec{l}_o = \vec{l}_p - (\vec{l} - \vec{l}_p) = 2(\vec{n} \cdot \vec{l}) \vec{n} - \vec{l}\).

  • Vetor halfway

    um vetor \(\vec{h}\) intermediário entre \(\vec{l}\) e \(\vec{v}\). Como \(\vec{h}\) está na metade do caminho entre \(\vec{l}\) e \(\vec{v}\), e ambos foram normalizados (tem comprimento unitário), podemos calcular \(\vec{h}\) como a média desses dois vetores e normalizando o resultado. Devido a normalização, a divisão por 2 para calcular a média não é necessária.

    \(\vec{h} = normalize( \vec{l} + \vec{v })\).

17.2. Cálculo da iluminação usando o modelo de Phong

Não há muitos exemplos de objetos que sejam refletores puramente difusos ou puramente especulares. O modelo de reflexão de Phong é baseado na suposição que podemos modelar (razoavelmente bem) os efeitos de iluminação sobre a superfície de qualquer objeto (sem textura) por meio de uma mistura de componentes de reflexão puramente difusos e especulares juntamente com emissão e reflexão ambiente. Vamos ignorar a emissão por enquanto, pois é a mais rara do grupo e será fácil de adicionar ao final do processo.

As propriedades do material da superfície de cada objeto serão especificadas por vários parâmetros, indicando a cor intrínseca do objeto e sua refletância ambiente, difusa e especular. Seja \(C\) a cor RGB do objeto. Como vimos na aula passada, vamos assumir que a energia da luz é dada por três vetores RGB: sua intensidade ambiente \(La\), sua intensidade difusa \(Ld\) e sua intensidade especular, \(Ls\). Lembre-se que não estamos desenvolvendo um modelo fisicamente realista mas computacionalmente eficiente, ou seja, cada componente pode ser diferente.

17.2.1. Luz ambiente

A luz ambiente é a mais simples de calcular. Seja \(Ia\) a intensidade da componente devido a reflexão ambiente. Para cada superfície vamos atribuir um coeficiente de reflexão ambiente \(\rho_a\) tal que

\(0 \le \rho_a \le 1\).

Esse coeficiente define a fração da luz ambiente que é refletida pela superfície. A componente de reflexão ambiente é calculada como:

\(Ia = \rho_a \; La \; C\).

Observe que essa é uma equação vetorial, cujo resultado é uma cor RGB.

17.2.2. Reflexão difusa

Para calcular a componente devido à reflexão difusa vamos assumir que a luz incidente de qualquer direção é refletida uniformemente em todas as direções. Uma superfície assim é chamada de refletor lamberciano. A explicação física para esse tipo de reflexão é que, a um nível microscópico, o objeto possui irregularidades que espalham a luz uniformemente em todas as direções.

A iluminação sobre superfícies lambercianas depende da orientação da superfície com relação a fonte de luz. Por isso algumas partes da superfície aparecem mais brilhantes que outras. As regiões da superfície mais perpendiculares ao vetor que aponta para a fonte de luz (\(\vec{l}\)) recebem mais energia por área e, portanto, parecem mais brilhantes. À medida que o ângulo entre a normal à superfície \(\vec{n}\) e \(\vec{l}\) aumenta, a energia luminosa é espalhada por uma área maior e, portanto, cada ponto recebe uma quantidade menor de luz.

Lei do cosseno de Lambert.

Fig. 17.2 Reflexão difusa segue a lei do cosseno de Lambert.

A Figura Fig. 17.2 mostra que, à medida que o ângulo \(\theta\) entre a normal \(\vec{n}\) e o vetor luz \(\vec{l}\) aumenta (até um máximo de 90 graus), então a quantidade de luz que incide sobre uma pequena área da superfície \(dA\) é proporcional à área da seção transversal perpendicular do feixe de luz, \(dA \; cos \theta\). Essa propriedade é chamada de Lei do Cosseno de Lambert.

O parâmetro chave do acabamento da superfície que controla a reflexão difusa é \(\rho_d\), o coeficiente de reflexão difusa da superfície. Seja \(Id\) a componente difuso da fonte de luz. Se assumirmos que \(l\) e \(n\) são ambos normalizados, então temos que \(cos \theta = (\vec{n}\cdot\vec{l}\)). Se \((\vec{n}\cdot\vec{l})<0\), então o ponto está no lado escuro do objeto (não recebe luz diretamente da fonte). A componente difusa da reflexão é:

\(Id = \rho_d \; max(0, \vec{n}\cdot\vec{l}) \; Ld \; C\).

Essa componente é sujeita a atenuação, dependendo da distância do objeto à fonte de luz.

17.2.3. Reflexão especular

A maioria dos objetos não são refletores lambercianos perfeitos. Um dos desvios mais comuns ocorre com objetos metálicos lisos ou altamente polidos. Esses objetos costumam apresentar pontos brilhantes resultado da reflexão especular.

Teoricamente, esses pontos surgem porque, a um nível microscópico, ao invés da luz ser espalhada perfeitamente por micro rugosisades, a superfície é suave a ponto de se comportar parcialmente como um espelho, como ilustrado na Figura Fig. 16.1.

Existem duas formas comuns de modelar a reflexão especular. O modelo original de Phong usa o vetor de reflexão, como derivado anteriormente. Uma segunda forma, um pouco mais eficiente, usa um vetor chamado halfway vector e produz essencialmente o mesmo resultado.

Observe que se a direção da câmera (ou olho) estiver perfeitamente alinhada com o vetor de reflexão \(\vec{r}\), então \(\vec{h}\) se alinhará perfeitamente com a normal \(\vec{n}\). Nesse caso, temos que (\(\vec{n} \cdot \vec{h}\)) será máximo. Por outro lado, quando o olho se desvia de \(\vec{r}\), então \(\vec{h}\) não se alinhará com \(\vec{n}\), e o valor de (\(\vec{n} \cdot \vec{h}\)) tenderá a diminuir. Assim, podemos usar (\(\vec{n} \cdot \vec{h}\)) como parâmetro geométrico para medir a força da componente especular. O modelo original de Phong usa o fator (\(\vec{r} \cdot \vec{v}\)) em vez disso.

Os parâmetros de acabamento da superfície que controlam a reflexão especular são \(\rho_s\), o coeficiente de reflexão especular da superfície e o brilho, denotado \(\alpha\). À medida que \(\alpha\) aumenta, a reflexão especular diminui mais rapidamente e, portanto, o tamanho do ponto brilhante resultante na superfície também parece menor. Os valores de brilho variam de 1 para baixa reflexão especular até, digamos, 1000, para reflexão altamente especular. A fórmula da componente especular é

\(Is = \rho_s \; max(0, \vec{n}\cdot\vec{h})^\alpha \; Ls\).

Assim como a componente difusa, essa componente também é sujeita à atenuação.

17.2.4. Juntando tudo

Todas as componentes, incluindo \(Ie\) (a componente de emissão), podem ser combinadas para calcular a reflexão total da luz proveniente de uma fonte \(L\) sobre um ponto distante \(d\) dessa fonte da seguinte forma:

\(I = Ie + Ia + (Id + Is) / (a + b d + c d^2)\);

\(I = Ie + \rho_a\; La\; C + (\rho_d\; max(0, \vec{n}\cdot\vec{l})\; Ld \; C + \rho_s \; max(0, \vec{n}\cdot\vec{h})^\alpha \; Ls) \; / \; (a + b d + c d^2)\).

Lembre-se que essa é uma equação vetorial, calculada componente a componente para R, G e B. Para múltiplas fontes de luz, precisamos somar as componentes ambiente, difusa e especular provenientes de cada fonte.

17.3. Onde estamos e para onde vamos?

Nessa aula vimos como calcular a iluminação resultante das componentes de reflexão do modelo de Phong: emissão, ambiente, difusão e especular.

Na próxima aula, veremos como aplicar esse modelo para renderizar imagens usando WebGL.

17.4. Para saber mais