10.2 Empacotamento

No OpenGL, o modo de empacotamento da textura (em inglês, texture wrapping) define o comportamento do amostrador de textura quando as coordenadas \((u,v)\) estão fora do intervalo \([0, 1]\). Há três comportamentos principais:

  • GL_REPEAT: repete a textura fora do intervalo. Esse é o modo padrão de empacotamento.
  • GL_MIRRORED_REPEAT: igual ao anterior, mas a textura é espelhada em \(u\) e/ou \(v\) quando a parte inteira da coordenada é um número ímpar.
  • GL_CLAMP_TO_EDGE: Fixa as coordenadas no intervalo \([0, 1]\). O resultado é a repetição dos valores das primeiras e últimas linhas/colunas da textura.

A figura 10.13 mostra o resultado dos diferentes modos de empacotamento no intervalo de \((-1,-1)\) a \((2,2)\) no espaço de textura.

Modos de empacotamento do OpenGL.

Figura 10.13: Modos de empacotamento do OpenGL.

O modo de repetição (GL_REPEAT) é frequentemente utilizado para produzir padrões formados por texturas ininterruptas (seamless textures). Essas texturas, quando dispostas lado a lado ou como um ladrilho, formam um padrão contínuo. Um exemplo é mostrado na figura 10.14.

Textura ininterrupta com empacotamento `GL_REPEAT` (adaptado do [original](https://commons.wikimedia.org/wiki/File:797_-_Ancient_Greece_Vase_-_Seamless_Pattern.jpg)).

Figura 10.14: Textura ininterrupta com empacotamento GL_REPEAT (adaptado do original).

O modo de empacotamento é configurado com a função glTexParameteri. É possível configurar um comportamento diferente para a direção \(u\) (com GL_TEXTURE_WRAP_S) e direção \(v\) (com GL_TEXTURE_WRAP_T). Por exemplo, o código a seguir habilita o modo de repetição em \(u\) e o modo de repetição espelhada em \(v\):

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);

Em texturas 3D, é possível usar ainda a direção \(w\) (com GL_TEXTURE_WRAP_R).

Outros modos de empacotamento estão disponíveis além dos modos GL_REPEAT, GL_MIRRORED_REPEAT e GL_CLAMP_TO_EDGE, mas não são suportados em todas as especificações OpenGL. Por exemplo, o modo GL_CLAMP_TO_BORDER, que usa uma cor sólida para texels fora do intervalo \([0,1]\), não é suportado no OpenGL ES utilizado no WebGL.