9 Iluminação

Em todos os projetos que fizemos até agora, utilizamos estratégias simples para determinar a cor dos pixels, tais como:

  • Usar um atributo de cor para cada vértice e deixar o rasterizador interpolar linearmente essas cores para gerar um degradê, como no projeto coloredtriangles (seção 4.4).
  • Desenhar todos os fragmentos de um objeto com uma mesma cor pré-definida pela aplicação, e enviar essa cor ao shader como uma variável uniforme, como no projeto asteroids (seção 5.2).
  • Calcular uma intensidade de cor com base na coordenada \(z\) do vértice ou fragmento. No projeto loadmodel (seção 6.4), fizemos isso no fragment shader usando gl_FragCoord.z no espaço da janela. No projeto lookat (seção 7.6), fizemos isso no vertex shader usando a coordenada \(z\) no espaço da câmera.

A figura 9.1 mostra alguns desses resultados.

Uma amostra dos resultados dos projetos anteriores, cada um como uma estratégia diferente para determina as cores dos pixels.

Figura 9.1: Uma amostra dos resultados dos projetos anteriores, cada um como uma estratégia diferente para determina as cores dos pixels.

A partir deste capítulo, veremos como renderizar cenas iluminadas por uma ou mais fontes de luz. O uso de iluminação (lighting) e sombreamento (shading) de superfícies desempenha um papel importante na percepção da forma e volume da geometria 3D projetada.

Compare na figura 9.2 a renderização do Stanford Bunny usando uma cor sólida (esquerda), o shader que utilizamos no projeto lookat (centro), e um dos shaders de sombreamento que abordaremos neste capítulo (direita). Muitos dos detalhes de variação da curvatura da superfície só são percebidos na superfície iluminada.

Percepção da forma e volume com e sem sombreamento. Esquerda: cor sólida. Centro: intensidade de cor de acordo com profundidade do pixel. Direita: sombreamento de superfície iluminada por uma fonte de luz.

Figura 9.2: Percepção da forma e volume com e sem sombreamento. Esquerda: cor sólida. Centro: intensidade de cor de acordo com profundidade do pixel. Direita: sombreamento de superfície iluminada por uma fonte de luz.

A interação da luz com os objetos tridimensionais de uma cena virtual pode ser modelada através de um modelo de iluminação.

O modelo de iluminação descreve a relação entre a luz incidente em cada ponto de uma superfície e a luz refletida em uma dada direção. Tal relação depende das propriedades do material da superfície, das fontes de luz existentes na cena, e da luz refletida por outras superfícies.

O capítulo está organizado da seguinte forma:

  • Na seção 9.1 é apresentada a forma geral da equação que modela a interação entre a luz que incide sobre um ponto de uma superfície do cenário virtual, e então é refletida em alguma direção, que pode ser a direção até um pixel do plano de imagem.
  • Na seção 9.2 é descrito o modelo de reflexão de Phong, que é um modelo de iluminação que considera apenas a iluminação direta entre uma fonte de luz e o ponto de uma superfície. O modelo é simples o suficiente para ser utilizado em renderização em tempo real. Uma variação do modelo de Phong – o modelo de Blinn–Phong – é apresentada na seção 9.3.
  • A seção 9.4 apresenta as diferentes abordagens de avaliação do modelo de iluminação sobre superfícies suaves aproximadas por malhas poligonais: avaliação nas faces da malha poligonal (sombreamento flat), nos vértices (sombreamento de Gouraud) e nos fragmentos (sombreamento de Phong).
  • As seções 9.5 e 9.6 contêm o passo a passo de implementação do cálculo de vetores normais em triângulos e vértices (projeto viewer2), e a implementação do modelo de Phong e Blinn-Phong no vertex shader e fragment shader (projeto viewer3).