O que a alteração de GL_TEXTURE_WRAP) _ (S / T) faz?

11

Estou trabalhando com alguns tutoriais iniciantes em OpenGL, e o atual ensina como aplicar uma textura a um retângulo simples. Os estados do tutorial dizem para definir os parâmetros de textura GL_TEXTURE_WRAP_S e GL_TEXTURE_WRAP_T para GL_CLAMP_TO_EDGE, no entanto, não tenho certeza do que isso realmente faz. Estou ciente de que é algo relacionado à forma como são tratadas as texturas maiores / menores que o espaço para o qual estão sendo mapeadas, mas não tenho certeza de qual comportamento isso realmente causa. O que GL_CLAMP_TO_EDGE faz e como isso é diferente de GL_CLAMP, GL_CLAMP_TO_BORDER, GL_REPEAT? Muito obrigado antecipadamente, e bônus em ajudar se você puder fornecer imagens para um idiota como eu.

w4etwetewtwet
fonte

Respostas:

29

Bem, S e T significam U e V (ou X e Y, se você preferir), ou no GLSL:

vec4.xyzw == vec4.rgba == vec4.strq

O modo GL_REPEAT faz com que as texturas se repitam quando você passa do intervalo (0,0) a (1,1)

O modo GL_CLAMP_TO_EDGE faz com que as texturas parem no último pixel quando você cai da borda.

GL_CLAMP e GL_CLAMP_TO_BORDER são depreciados porque todas as bordas da textura devem ter 0 pixels, para que os modos não façam mais sentido. (em algum lugar ao redor do GL3 eu acredito)

Existem mais modos, portanto, leia os documentos. (Exemplos: GL_MIRRORED_REPEAT, GL_MIRROR_CLAMP_TO_EDGE)


Existem alguns bons exemplos em http://www.flipcode.com/archives/Advanced_OpenGL_Texture_Mapping.shtml , aqui está uma prévia:

Invólucro S: GL_CLAMP / Invólucro T: GL_CLAMP

braçadeira braçadeira

Invólucro S: GL_CLAMP / Invólucro T: GL_REPEAT

braçadeira repetir

Invólucro S: GL_REPEAT / Invólucro T: GL_CLAMP

braçadeira de repetição

Invólucro S: GL_REPEAT / Invólucro T: GL_REPEAT

repetir repetir

MickLH
fonte
Obrigado. Ótima resposta. Você sabe se existe alguma diferença entre GL_CLAMP_TO_EDGE e GL_CLAMP, e se existe alguma maneira de obter a textura para expandir para preencher o espaço disponível?
W4etwetewtwet
Desculpe por não esclarecer, onde digo CLAMP, quero dizer GL_CLAMP_TO_EDGE, GL_CLAMP desapareceu no OpenGL moderno. Vou editar a resposta para enfatizar isso.
MickLH
Quanto à "expansão", se você simplesmente quer esticar a textura em um intervalo diferente, isso deve ser tratado durante a parametrização da malha. (Mapeamento UV, trabalho de artistas). Se você realmente deve fazer isso pragmaticamente, precisará escrever sua própria fórmula para usar em um shader. (Ou eu acho matriz GL_TEXTURE se o seu aplicativo é severamente já ultrapassada: P)
MickLH
3

Aqui está um extrato da página de referência do OpenGL no glTexParameter a partir de 07/02/2014, formatado um pouco para facilitar a leitura:

GL_TEXTURE_WRAP_S

Define o parâmetro envoltório para a textura coordenar s , quer GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, GL_MIRRORED_REPEAT, GL_REPEAT, ou GL_MIRROR_CLAMP_TO_EDGE.

  • GL_CLAMP_TO_EDGE faz com que as coordenadas s sejam fixadas no intervalo alcance, onde N é o tamanho da textura na direção da fixação.

  • GL_CLAMP_TO_BORDER avalia as coordenadas s de maneira semelhante a GL_CLAMP_TO_EDGE.
    No entanto, nos casos em que o aperto ocorreria no modo GL_CLAMP_TO_EDGE, os dados texel buscados são substituídos pelos valores especificados por GL_TEXTURE_BORDER_COLOR.

  • GL_REPEAT faz com que a parte inteira da coordenada s seja ignorada;
    o GL usa apenas a parte fracionária, criando assim um padrão de repetição.

  • GL_MIRRORED_REPEAT faz com que a coordenada s seja definida como a parte fracionária da coordenada de textura se a parte inteira de s for par; se a parte inteira de s for ímpar, a coordenada de textura s será definida como 1-frac, onde fracrepresenta a parte fracionária de s .

  • GL_MIRROR_CLAMP_TO_EDGE faz com que a coordenada s seja repetida como para GL_MIRRORED_REPEAT para uma repetição da textura, momento em que a coordenada deve ser fixada como em GL_CLAMP_TO_EDGE.

Inicialmente, GL_TEXTURE_WRAP_S é definido como GL_REPEAT .

limpe
fonte