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, também chamado simplesmente de textura. Em geral, uma textura é uma imagem digital armazenada como um mapa de bits. Entretanto, texturas também podem ser geradas de forma procedural através da avaliação de funções ou algoritmos. Um exemplo de textura procedural é uma textura obtida através da avaliação de um fractal ou função de geração de ruído.
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 malha geométrica.
A figura 10.1 mostra um exemplo de mapeamento de uma textura retangular (uma imagem bitmap) 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 são usadas neste caso para definir 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.
No mapeamento da figura 10.1, cada ponto \((x,y,z) \in \mathbb{R}^3\) da esfera centralizada na origem e com polos alinhados com 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)\) é a função atan2
que, como vimos anteriormente, corresponde ao arco tangente modificado de \(x/z\) que 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 é comumente chamada de texel (texture element). Um texel é simplesmente 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.