Vimos como é possível produzir imagens mais realistas aplicando efeitos de iluminação usando um modelo relativamente simples como o de reflexão de Phong. Esses efeitos funcionam bem para superfícies lisas com cores uniformes como, por exemplo, calotas de carros, paredes de gesso e copos de plástico, mas para renderizar superfícies com acabamentos mais complexos, com uma pia de mármore, precisamos também usar modelos mais complexos e detalhados. Por exemplo, poderíamos tentar modelar uma superfície por meio de uma textura matemática como um tabuleiro de xadrez ou tijolos em uma parede, mas isso pode ser inviável para texturas mais complexas com padrões irregulares.
Uma alternativa para evitar o uso de modelos matemáticos é aplicar texturas. A ideia é tirar uma foto (ou fotos) de uma textura que aparece na natureza e mapear essa foto na superfície de um objeto, como se estivéssemos embrulhando o objeto com a foto.
Embora originalmente projetado para preencher superfícies texturizadas, o processo de mapeamento de textura pode ser usado para mapear (ou “embrulhar”) qualquer imagem digitalizada em uma superfície. Por exemplo, suponha que queremos renderizar uma imagem da Mona Lisa na capa de um livro, ou envolver um mapa (imagem 2D) da Terra em torno de uma esfera, ou desenhar um gramado em um campo de futebol. Poderíamos baixar uma fotografia digitalizada dessas texturas e depois mapear essas imagens sobre as superfícies como parte do processo de renderização.
As imagens podem ser armazenadas em vários formatos como PNG, JPEG, GIF, PPM, PDF, etc. Não vamos discutir esses formatos. Em vez disso, vamos considerar que uma imagem é simplesmente uma matriz bidimensional de valores RGB. As imagens são normalmente indexadas linha por linha com origem no canto superior esquerdo.
Para simplificar nossa discussão, vamos supor que a imagem de uma textura é quadrada, de dimensões pixel
, vamos chamar cada elemento da textura como texel
, de texture element.
Observe que o número de pixels em uma superfície em geral não vai corresponder ao número de texels. Assim, ao invés de usar índices na matriz de texels, vamos utilizar uma função que
mapeia um ponto
Por exemplo, assumindo que uma matriz de textura
, para .
Fig. 19.1 Espaço da textura.¶
Em muitos casos, é conveniente pensar que a textura é uma função infinita. Fazemos isso imaginando que a imagem da textura se repete ciclicamente em todo o plano. Isso é útil ao aplicar uma textura pequena, como um pedaço de grama, a uma superfície muito grande, como a superfície de um campo de futebol. Isso às vezes é chamado de textura repetida. Neste caso, podemos modificar a função acima para:
, para .
Suponha que desejamos “embrulhar” uma imagem de textura bidimensional na superfície de uma esfera de raio unitário. Precisamos definir uma função de embrulho (wrapping function) que consiga fazer isso. A superfície reside no espaço tridimensional, então a função de embrulho precisaria mapear um ponto
Mais tarde veremos que não é a função de embrulho que precisamos calcular, mas sim sua inversa. Então, vamos considerar o problema de calcular uma função
Isso normalmente é feito primeiro calculando uma parametrização bidimensional da superfície. Isso significa que associamos cada ponto na superfície do objeto com duas coordenadas
Para determinar a função de desembrulho vamos mapear um ponto
A seguir vamos ver como fazer isso com uma esfera.
Vamos usar uma esfera de raio unitário, centrada na origem. Queremos encontrar a função de desembrulho
Primeiro precisamos criar uma parametrização de superfície para a esfera. Um ponto na esfera pode ser representado por dois ângulos, que correspondem à latitude e longitude do ponto.
Usaremos uma abordagem um pouco diferente. Qualquer ponto na esfera pode ser expresso por dois ângulos,
Fig. 19.2 Parametrização de uma esfera.¶
Considere um vetor da origem até o ponto desejado na esfera. Seja
Nossa próxima tarefa é determinar como converter um ponto
A coordenada
,
,
.
Mas o que precisamos saber é como mapear
Portanto,
e .
Lembre-se que isso pode ser calculado com precisão usando atan2(y, x)
.
O passo final é mapear o par de parâmetros (
O valor de
onde , e
onde .
Observe que nos pólos norte e sul há uma singularidade no sentido de que não podemos derivar um valor único para
Para resumir, a função de desembrulho
Para este exemplo, vamos simplesmente usar a função identidade, ou seja,
Suponha que a função de desembrulho
Vamos começar considerando um pixel que desejamos desenhar. Esse pixel corresponde a uma região sobre a superfície do objeto, que se projeta sobre o pixel. Podemos determinar esse fragmento por 4 pontos sobre a superfície que correspondem aos 4 cantos do pixel. Por simplicidade, vamos supor que uma única superfície cubra todo o fragmento. Caso contrário, devemos calcular a média das contribuições dos vários fragmentos de superfícies para este pixel.
Calculamos os parâmetros
Em seguida, aplicamos a função de desembrulho para determinar a região correspondente do espaço de textura. Observe que essa região geralmente pode ter lados curvos, se a função de desembrulho for não linear. Calculamos a intensidade média dos texels nesta região do espaço de textura por um processo chamado filtragem (filtering). Por exemplo, isso pode envolver o cálculo da soma ponderada dos valores dos texels que se sobrepõem a essa região e, em seguida, atribuir a cor média correspondente ao pixel.
Fig. 19.3 Processo de mapeamento de textura.¶
Nessa aula cobrimos os elementos matemáticos básicos do mapeamento de textura. Na próxima aula, consideraremos como fazer isso usando o WebGL.