9.4 Sombreamento
Sombreamento ou tonalização (do inglês shading) é o processo de modificar a intensidade das cores de uma imagem através de tons claros e escuros, de modo a produzir a percepção de volume e profundidade de um objeto tridimensional.
Em computação gráfica, as intensidades de cor calculadas através do modelo de iluminação são utilizadas para fazer o sombreamento da geometria projetada.
Há três modelos de sombreamento comumente utilizados:
- Sombreamento flat (flat shading);
- Sombreamento de Gouraud (Gouraud shading);
- Sombreamento de Phong (Phong shading).
Flat
O sombreamento flat consiste em avaliar a equação do modelo de iluminação uma vez para cada face da malha poligonal. Assim, o vetor \(\hat{\mathbf{n}}\) da equação deve ser o vetor normal do plano que contém a face. A cor resultante é utilizada para preencher todos os pixels da face.
A aplicação abaixo apresenta um exemplo de objeto renderizado com sombreamento flat. Use o botão esquerdo do mouse para rodar o objeto, e o botão direito para mudar a orientação da fonte de luz.
Uma vantagem do sombreamento flat é a eficiência. O número de vezes que a equação do modelo de ilumninação é avaliada depende apenas do número de faces que, em geral, é menor que o número de pixels.
No sombreamento flat, as descontinuidades da iluminação sobre a superfície ficam bem evidentes e o resultado é um aspecto facetado da malha poligonal. Isso pode ser desejável caso o objeto visualizado seja um poliedro. Entretanto, se a malha geométrica for a aproximação de uma superfície suave, o resultado só será satisfatório se a malha for subdividida em faces menores.
No exemplo acima, a malha triangular é uma aproximação de uma esfera. Experimente aumentar o número de subdivisões e observe como as descontinuidades de luz entre as faces são atenuadas.
Atualmente, não há melhoramento de eficiência de renderização com a implementação do sombreamento flat na GPU, pois o pipeline gráfico atual é otimizado para o processamento de atributos de vértices, e não atributos de triângulos.
Gouraud
Como forma de melhorar o sombreamento de malhas que aproximam superfícies suaves, o cientista da computação Henri Gouraud desenvolveu a técnica que ficou conhecida como sombreamento de Gouraud (Gouraud 1971), em substituição ao sombreamento flat.
A ideia do sombreamento de Gouraud é avaliar a equação do modelo de iluminação para cada vértice da malha. Assim, cada vértice tem uma cor calculada. No rasterizador, as cores dos vértices são interpoladas linearmente para gerar a cor final de cada pixel.
A aplicação abaixo implementa o sombreamento de Gouraud.
O sombreamento de Gouraud suaviza as descontinuidades de iluminação entre as faces. O resultado é mais convincente que o sombreamento flat para o mesmo número de faces. Entretanto, a intensidade sobre as arestas pode parecer ligeiramente maior que a intensidade dentro da primitiva. Esse defeito visual, chamado de bandas de Mach, se deve ao fato do sistema visual humano exagerar naturalmente o contraste nas extremidades de variações lineares de gradientes de cor.
Outro problema do sombreamento de Gouraud é a perda do brilho especular quando nenhum vértice da malha encontra-se dentro da região do brilho. Na aplicação acima, observe como o brilho especular surge e desaparece de forma intermitente quando o número de subdivisões é baixo (de 0 a 2). Isso pode ser melhorado aumentando o refinamento da malha, mas sob o custo de aumentar o tempo de processamento.
Ao usar sombreamento de Gouraud, o vetor \(\hat{\mathbf{n}}\) da equação do modelo de iluminação precisa ser o vetor normal de vértice, que pode ser calculado como a média dos vetores normais das faces adjacentes (seção 6.3).
Phong
O sombreamento de Phong é o mais custoso dos sombreamentos, e consiste em avaliar a equação do modelo de iluminação para cada fragmento. O resultado é muito superior ao sombreamento de Gouraud para um mesmo número de faces.
No sombreamento de Phong, as bandas de Mach são praticamente imperceptíveis. Além disso, o brilho especular é mantido independentemente do refinamento da malha.
Ao usar sombreamento de Phong, precisamos calcular um vetor \(\hat{\mathbf{n}}\) para cada fragmento. Isso pode feito através da interpolação linear das coordenadas \((x,y,z)\) dos vetores normais de vértice, da mesma forma como as componentes RGB das cores dos vértices são interpoladas para criar um degradê de cores. Entretanto, neste caso, o vetor de coordenadas interpoladas é re-normalizado no fragment shader para ser utilizado como vetor \(\hat{\mathbf{n}}\) da equação.
Atualmente, o sombreamento de Phong é o sombreamento mais utilizado em síntese de imagens em tempo real.
Note que “modelo de reflexão de Phong” e “sombreamento de Phong” são conceitos diferentes:
- O modelo de reflexão de Phong é o modelo empírico de iluminação local descrito através da equação de reflexão vista na seção 9.2.
- O sombreamento de Phong é a estratégia de avaliar, para cada fragmento, a equação de um modelo de iluminação. O modelo de iluminação avaliado não precisa ser o modelo de reflexão de Phong.