Que fait la modification de GL_TEXTURE_WRAP) _ (S / T)?

12

Je travaille sur des tutoriels OpenGL pour débutants, et le cours actuel enseigne comment appliquer une texture à un simple rectangle. Les états du didacticiel m'indiquent de définir les paramètres de texture GL_TEXTURE_WRAP_S et GL_TEXTURE_WRAP_T sur GL_CLAMP_TO_EDGE, mais je ne suis pas sûr de ce que cela fait réellement. Je sais que cela a quelque chose à voir avec la façon dont les textures plus grandes / plus petites que l'espace sur lequel elles sont mappées sont gérées, mais je ne sais pas quel comportement cela provoque réellement. Que fait GL_CLAMP_TO_EDGE et en quoi est-ce différent de GL_CLAMP, GL_CLAMP_TO_BORDER, GL_REPEAT? Merci beaucoup à l'avance, et aide supplémentaire si vous pouvez fournir des images à un idiot comme moi.

w4etwetewtwet
la source

Réponses:

29

Eh bien S et T signifient simplement U et V (ou X et Y si vous préférez), ou en GLSL:

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

Le mode GL_REPEAT a des textures qui se répètent lorsque vous dépassez la plage (0,0) à (1,1)

Le mode GL_CLAMP_TO_EDGE a des textures qui s'arrêtent au dernier pixel lorsque vous tombez du bord.

Les GL_CLAMP et GL_CLAMP_TO_BORDER sont dépréciés car toutes les bordures de texture doivent être de 0 pixel, donc les modes n'ont plus de sens. (quelque part autour de GL3 je crois)

Il y a plus de modes alors assurez-vous de lire les documents. (Exemples: GL_MIRRORED_REPEAT, GL_MIRROR_CLAMP_TO_EDGE)


Il y a quelques bons exemples sur http://www.flipcode.com/archives/Advanced_OpenGL_Texture_Mapping.shtml , voici un aperçu:

Wrap S: GL_CLAMP / Wrap T: GL_CLAMP

pince pince

Wrap S: GL_CLAMP / Wrap T: GL_REPEAT

répéter la pince

Wrap S: GL_REPEAT / Wrap T: GL_CLAMP

répéter la pince

Wrap S: GL_REPEAT / Wrap T: GL_REPEAT

répéter répéter

MickLH
la source
Merci. Très bonne réponse. Savez-vous s'il y a une différence entre GL_CLAMP_TO_EDGE et GL_CLAMP, et s'il y a un moyen de simplement développer la texture pour remplir l'espace disponible?
w4etwetewtwet du
Désolé de ne pas avoir précisé, où je dis CLAMP, je veux dire GL_CLAMP_TO_EDGE, GL_CLAMP a disparu dans OpenGL moderne. Je vais modifier la réponse pour le souligner.
MickLH
En ce qui concerne "l'expansion", si vous voulez simplement étirer la texture dans une plage différente, cela devrait être géré lors du paramétrage du maillage. (Cartographie UV, travail d'artistes). Si vous devez vraiment le faire de manière pragmatique, vous devrez écrire votre propre formule à utiliser dans un shader. (Ou je suppose que la matrice GL_TEXTURE si votre application est déjà sérieusement obsolète: P)
MickLH
4

Voici un extrait de la page de référence OpenGL sur glTexParameter à partir du 2014/02/07, formaté un peu pour une lecture plus facile:

GL_TEXTURE_WRAP_S

Définit le paramètre d’ habillage des coordonnées de texture s sur GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, GL_MIRRORED_REPEAT, GL_REPEAT ou GL_MIRROR_CLAMP_TO_EDGE.

  • GL_CLAMP_TO_EDGE provoque le serrage des coordonnées s sur la plage intervalle, où N est la taille de la texture dans le sens du serrage.

  • GL_CLAMP_TO_BORDER évalue les coordonnées de la même manière que GL_CLAMP_TO_EDGE.
    Cependant, dans les cas où le blocage se serait produit en mode GL_CLAMP_TO_EDGE, les données de texel récupérées sont remplacées par les valeurs spécifiées par GL_TEXTURE_BORDER_COLOR.

  • GL_REPEAT fait ignorer la partie entière de la coordonnée s ;
    le GL utilise uniquement la partie fractionnaire, créant ainsi un motif répétitif.

  • GL_MIRRORED_REPEAT entraîne la définition de la coordonnée s sur la partie fractionnaire de la coordonnée de texture si la partie entière de s est paire; si la partie entière de s est impaire, alors la coordonnée de texture s est définie sur 1 frac, où fracreprésente la partie fractionnaire de s .

  • GL_MIRROR_CLAMP_TO_EDGE entraîne la répétition de la coordonnée s comme pour GL_MIRRORED_REPEAT pour une répétition de la texture, point auquel la coordonnée doit être bloquée comme dans GL_CLAMP_TO_EDGE.

Initialement, GL_TEXTURE_WRAP_S est défini sur GL_REPEAT .

essuyer
la source