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 usandogl_FragCoord.z
no espaço da janela. No projetolookat
(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.
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.
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 (projetoviewer3
).