¿Qué hace cambiar GL_TEXTURE_WRAP) _ (S / T)?

12

Estoy trabajando en algunos tutoriales de OpenGL para principiantes, y el actual enseña cómo aplicar una textura a un rectángulo simple. Los estados del tutorial me dicen que configure los parámetros de textura GL_TEXTURE_WRAP_S y GL_TEXTURE_WRAP_T en GL_CLAMP_TO_EDGE, sin embargo, no estoy seguro de lo que esto realmente hace. Soy consciente de que tiene algo que ver con la forma en que se manejan las texturas más grandes / más pequeñas que el espacio en el que se asignan, pero no estoy seguro de qué comportamiento realmente causa esto. ¿Qué hace GL_CLAMP_TO_EDGE y en qué se diferencia de GL_CLAMP, GL_CLAMP_TO_BORDER, GL_REPEAT? Muchas gracias de antemano y un extra de ayuda si puedes proporcionar imágenes para un idiota como yo.

w4etwetewtwet
fuente

Respuestas:

29

Bueno, S y T solo significan U y V (o X e Y si lo prefieres), o en GLSL:

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

El modo GL_REPEAT tiene texturas repetidas cuando pasas de (0,0) a (1,1) rango

El modo GL_CLAMP_TO_EDGE tiene texturas que se detienen en el último píxel cuando se cae del borde.

GL_CLAMP y GL_CLAMP_TO_BORDER se deprecian porque todos los bordes de textura deben ser 0 píxeles, por lo que los modos ya no tienen sentido. (En algún lugar alrededor de GL3, creo)

Hay más modos, así que asegúrese de leer los documentos. (Ejemplos: GL_MIRRORED_REPEAT, GL_MIRROR_CLAMP_TO_EDGE)


Hay algunos buenos ejemplos en http://www.flipcode.com/archives/Advanced_OpenGL_Texture_Mapping.shtml , aquí hay una vista previa:

Ajuste S: GL_CLAMP / Ajuste T: GL_CLAMP

abrazadera abrazadera

Ajuste S: GL_CLAMP / Ajuste T: GL_REPEAT

abrazadera repetir

Ajuste S: GL_REPEAT / Ajuste T: GL_CLAMP

repetir abrazadera

Ajuste S: GL_REPEAT / Ajuste T: GL_REPEAT

repetir repetir

MickLH
fuente
Gracias. Gran respuesta. ¿Sabes si hay alguna diferencia entre GL_CLAMP_TO_EDGE y GL_CLAMP, y si hay alguna forma de hacer que la textura se expanda para llenar el espacio disponible?
w4etwetewtwet
Perdón por no aclarar, cuando digo CLAMP me refiero a GL_CLAMP_TO_EDGE, GL_CLAMP se ha ido en OpenGL moderno. Editaré la respuesta para enfatizar eso.
MickLH
En cuanto a "expandir" si simplemente quiere decir estirar la textura en un rango diferente, eso debe manejarse durante la parametrización de la malla. (Mapeo UV, trabajo de artistas). Si realmente debe hacerlo de manera pragmática, tendrá que escribir su propia fórmula para usar en un sombreador. (O supongo que GL_TEXTURE matrix si su aplicación ya está muy desactualizada: P)
MickLH
4

Aquí hay un extracto de la página de referencia de OpenGL en glTexParameter a partir del 2014/02/07, formateado un poco para facilitar la lectura:

GL_TEXTURE_WRAP_S

Establece el parámetro Wrap para la textura de coordenadas s a cualquiera GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, GL_MIRRORED_REPEAT, GL_REPEAT o GL_MIRROR_CLAMP_TO_EDGE.

  • GL_CLAMP_TO_EDGE hace que las coordenadas s se sujeten al rango rango, donde N es el tamaño de la textura en la dirección de sujeción.

  • GL_CLAMP_TO_BORDER evalúa las coordenadas s de manera similar a GL_CLAMP_TO_EDGE.
    Sin embargo, en los casos en que la sujeción se hubiera producido en el modo GL_CLAMP_TO_EDGE, los datos de texel recuperados se sustituyen con los valores especificados por GL_TEXTURE_BORDER_COLOR.

  • GL_REPEAT hace que se ignore la parte entera de la coordenada s ;
    el GL usa solo la parte fraccional, creando así un patrón repetitivo.

  • GL_MIRRORED_REPEAT hace que la coordenada s se establezca en la parte fraccionaria de la coordenada de textura si la parte entera de s es par; si la parte entera de s es impar, entonces la coordenada de textura s se establece en 1-frac, donde fracrepresenta la parte fraccionaria de s .

  • GL_MIRROR_CLAMP_TO_EDGE hace que la coordenada s se repita como para GL_MIRRORED_REPEAT para una repetición de la textura, en cuyo punto la coordenada se sujetará como en GL_CLAMP_TO_EDGE.

Inicialmente, GL_TEXTURE_WRAP_S se establece en GL_REPEAT .

wip
fuente