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 (ou chamada simplesmente de textura), que geralmente é uma imagem 2D.

Os valores da 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 o planeta 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.

Figura 10.1: Mapeamento de textura sobre uma esfera.

No mapeamento da figura 10.1, cada ponto \((x,y,z) \in \mathbb{R}^3\) da esfera unitária centralizada na origem, com os polos atravessando o eixo \(y\), corresponde a um ponto \((u,v) \in \mathbb{R}^2\) do espaço da 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)\) corresponde a \(\textrm{arctan}(x/z)\), mas leva em consideração o quadrante no plano \(zx\) e retorna um ângulo no intervalo \([-\pi, \pi]\). 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. Durante a amostragem de textura, é possível que um texel seja mapeado para vários pixels, ou que muitos texels sejam mapeados para apenas um pixel. Assim, é preciso definir critérios de filtragem de textura para contemplar esses casos. Os modos de filtragem de textura utilizados no OpenGL são descritos na seção 10.3.

As coordenadas \((u,v)\) dos texels são comumente chamadas de coordenadas de textura. No OpenGL, a origem das coordenadas de uma textura 2D é 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 3D de texels.