10 Texturização

Texturização, ou mapeamento de textura, é uma técnica de síntese de imagens que consiste em mapear coordenadas de pontos de uma superfície 3D para pontos de um mapa de textura, que geralmente é uma imagem 2D. Um mapa de textura é também chamado simplesmente de textura.

Os valores de uma textura podem ser utilizados para modificar as propriedades locais do material em cada ponto da superfície. Com isso, pode-se aumentar o nível de detalhes do objeto renderizado sem precisar aumentar o número de vértices da geometria.

A figura 10.1 mostra um exemplo de mapeamento de textura retangular sobre uma esfera unitária que representa a Terra. A esfera é renderizada com o modelo de reflexão de Blinn-Phong e sombreamento de Phong. As cores RGB da textura definem os valores de reflexão difusa do material (\(\kappa_d\)). Uma textura que, como esta, modifica os valores de reflexão difusa, é chamada de textura difusa.

Mapeamento de textura sobre uma esfera representando a Terra.

Figura 10.1: Mapeamento de textura sobre uma esfera representando a Terra.

No mapeamento da figura 10.1, cada ponto \((x,y,z) \in \mathbb{R}^3\) de uma esfera unitária centralizada na origem e com os polos atravessando o eixo \(y\) corresponde a um ponto \((u,v) \in \mathbb{R}^2\) do espaço de textura. O mapeamento realizado é um mapeamento esférico, definido pelas equações

\[ \begin{align} u&=\frac{\textrm{arctan2}\left(x, z\right)}{2\pi}+0.5,\\ v&=\frac{\arcsin(y)}{\pi}+0.5, \end{align} \] onde \(\textrm{arctan2}(x, z)\) é uma função que corresponde ao arco tangente de \(x/z\), mas que retorna um ângulo no intervalo \([-\pi, \pi]\) e usa os sinais dos argumentos para determinar o quadrante correto no plano \(zx\). O mapeamento esférico é detalhado na seção 10.1 junto com outras formas comuns de mapeamento.

A operação de determinar o valor da textura em um ponto \((u,v)\) é chamada de amostragem de textura. No OpenGL é possível amostrar texturas nos shaders e configurar o comportamento do amostrador para produzir diferentes efeitos.

A menor unidade de uma textura é chamada de texel (texture element). Um texel corresponde a um pixel do mapa da textura. Entretanto, o termo texel é usado no lugar de pixel neste contexto porque um pixel da textura (isto é, um texel) nem sempre corresponde exatamente a um pixel da tela. Durante a amostragem de textura, é comum que um texel seja mapeado para vários pixels do framebuffer, ou que muitos texels sejam mapeados para apenas um pixel. Podemos definir critérios de filtragem de textura para definir o que deve ser feito em cada caso. Os modos de filtragem de textura utilizados no OpenGL são descritos na seção 10.3.

As coordenadas \((u,v)\) do espaço de textura são chamadas de coordenadas de textura. No OpenGL, a origem das coordenadas do espaço de textura é o canto inferior esquerdo da textura. O canto superior direito tem coordenadas \((1,1)\). É possível amostrar uma textura em coordenadas fora do intervalo \([0,1]\), mas nesse caso o comportamento será definido de acordo com o modo de “empacotamento” de textura da API. Os diferentes comportamentos possíveis no OpenGL são descritos na seção 10.2.

Nosso foco será no uso de texturas 2D (GL_TEXTURE_2D). Entretanto, o OpenGL também fornece suporte a texturas 1D (GL_TEXTURE_1D) e 3D (GL_TEXTURE_3D). Uma textura 1D só possui uma coordenada \(u\) e é composta por uma sequência linear de texels. De forma semelhante, uma textura 3D possui coordenadas \((u,v,w)\) e é composta por um volume de texels.