¿Por qué es posible encontrar una coordenada de textura mayor que 1 o menor que 0?

11

Estoy estudiando un texto sobre texture mappingy en la preparing to drawsesión, leí:

Definir los parámetros de envoltura de textura. Esto controlará lo que sucede cuando se encuentra una coordenada de textura mayor que 1.0 o menor que 0.0:

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,wrap);  
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,wrap);  

donde wrap es:
GL_REPEAT: especifica que este patrón se repetirá (es decir, wrap-around) si se encuentran coordenadas de textura transformadas menores que 0.0 o mayores que 1.0.

GL_CLAMP: especifica que el patrón se "pegará" al valor de 0.0 o 1.0.

Pero no hay explicación ¿cuál es la razón de encontrar tales coordenadas de textura?
Por ejemplo, supongamos que acabo de dibujar un rectángulo y quiero aplicarle una imagen como textura, ¿es posible encontrar tales coordenadas?

Sepideh Abadpour
fuente

Respuestas:

5

No todas las texturas usan coordenadas de textura que provienen de los datos de malla. Por ejemplo, con texturas proyectivas , transforma el mundo en el espacio de la textura. Bueno, gran parte de ese mundo queda fuera del rango [0, 1] de la textura. Sin algún tipo de modo de sujeción, tendrás problemas.

Nicol Bolas
fuente
10

Precisamente, para repetir una textura.

Entonces, si tiene un quad y las coordenadas de textura van de 0 a 1, la textura se dibujará una vez. Si las coordenadas van de 0 a 2 y el ajuste se establece en GL_REPEAT, entonces la textura se dibujará dos veces.

Pruébelo y véalo usted mismo

Pijama Panda
fuente
ok @Panda Pyjama así que para un código como este: float x0 = 0; // esquina superior izquierda de la imagen float y0 = 0; flotante x1 = x0 + Ancho de imagen; // esquina inferior derecha de la imagen flotante y1 = y0 + ImageHeight; glBegin (GL_TRIANGLE_STRIP); {glTexCoord2f (0, 1); glVertex2f (x0, y1); glTexCoord2f (0, 0); glVertex2f (x0, y0); glTexCoord2f (1, 1); glVertex2f (x1, y1); glTexCoord2f (1, 0); glVertex2f (x1, y0); } no hay posibilidad de encontrar coordenadas de textura más allá del intervalo (0,1)?
Sepideh Abadpour
1
@sepideh: Por supuesto que no. Usted mantuvo específicamente sus coordenadas de textura en el rango [0, 1]. Lo que no entiendes es que no tienes que hacerlo ; podrías haberles hecho cualquier cosa. Además, no publique un montón de código en los comentarios. Si desea una aclaración, edite su pregunta.
Nicol Bolas
ok, gracias por tu orientación sobre cómo pasar códigos a mi pregunta. ¡Estaba buscando una forma de formatear códigos en comandos pero no pude encontrar! Entonces, quiere decir que encontrar tales coordenadas no es un evento posible en tiempo de ejecución. El programador lo especifica claramente para repetir la textura o no.
Sepideh Abadpour
1
@sepideh ¿Qué significa "no es posible un evento en tiempo de ejecución"? Está perfectamente bien cambiar su código en el comentario para tener, glTexCoord2f(0, 2);por ejemplo. Esto tiene un significado bien definido muy específico tanto en el código como cuando se ejecuta el programa. Si ve esto, el programador lo ha hecho intencionalmente porque le da el resultado que desea.
Joseph Mansfield
2
@sepideh Por supuesto. OpenGL usa cualquier valor que le des. Si le da valores en el rango de 0 a 1, nunca obtendrá nada más.
Joseph Mansfield
5

Sí, puede encontrar coordenadas de textura mayores 1.0y menores que 0.0.

Esto depende completamente del modelo que cargó. Normalmente, para cada vértice hay coordenadas de posición, normal y textura almacenadas. En la mayoría de los formatos de archivo de malla, la coordenada de textura no está restringida a ningún rango.

Esto se usa para repetir una textura . Por ejemplo, para abarcar una textura tiempo cuatro entre un quad de vértices, las coordenadas de textura serían 0,0, 0,4, 4,0y 4,4. Sin textura envoltura, se necesitaría vértices adicionales para dividir la superficie en 4 veces 4 sub superficies con cada uno de las coordenadas de textura 0,0, 0,1, 1,0, 1,1. Menos vértices dan como resultado un mejor rendimiento de representación.

Típicamente, no se desea que el usuario note los bordes de una textura repetida. Por lo tanto, las texturas repetidas son enlosables en la mayoría de los casos. Eso significa que el borde derecho se desvanece sin problemas hacia el izquierdo y el borde superior hacia el inferior. De esta manera, la transición es suave y esperamos que el usuario no se dé cuenta.

Un tema más avanzado, pero relacionado, es oscurecer hábilmente el hecho de que la misma textura se repitió varias veces. Por ejemplo, mezclar texturas repetidas de diferentes tamaños, por ejemplo, una textura de pared y una calcomanía de suciedad, es una técnica común.

danijar
fuente
Without texture wrapping, you would need additional vertices to split the surface into 4 times 4 sub surfaces with each the texture coordinates 0,0, 0,1, 1,0, 1,1¡Esa es una explicación práctica real! ¡Gracias!
Amit Tomar