Pourquoi est-il possible de rencontrer une coordonnée de texture supérieure à 1 ou inférieure à 0

11

J'étudie un texte sur texture mappinget dans la preparing to drawsession, je lis:

Définissez les paramètres d'habillage de texture. Cela contrôlera ce qui se passe lorsqu'une coordonnée de texture supérieure à 1,0 ou inférieure à 0,0 est rencontrée:

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

où wrap est:
GL_REPEAT: spécifie que ce motif se répétera (c'est-à-dire, wrap-around) si des coordonnées de texture transformées inférieures à 0,0 ou supérieures à 1,0 sont rencontrées.

GL_CLAMP: spécifie que le motif «collera» à la valeur à 0,0 ou 1,0.

Mais il n'y a aucune explication quelle est la raison de rencontrer de telles coordonnées de texture?
Par exemple, supposons que je viens de dessiner un rectangle et que je souhaite y appliquer une image comme texture, est-il possible de rencontrer de telles coordonnées?

Sepideh Abadpour
la source

Réponses:

5

Toutes les textures n'utilisent pas les coordonnées de texture provenant des données de maillage. Par exemple, avec la texturation projective , vous transformez le monde en espace de texture. Eh bien, beaucoup de ce monde se situe en dehors de la plage [0, 1] de la texture. Sans une sorte de mode de serrage en place, vous allez avoir des problèmes.

Nicol Bolas
la source
10

Précisément, pour répéter une texture.

Donc, si vous avez un quad et que les coordonnées de texture vont de 0 à 1, la texture sera dessinée une fois. Si les coordonnées vont de 0 à 2 et que l'habillage est défini sur GL_REPEAT, la texture sera dessinée deux fois.

Essayez et voyez par vous-même

Pyjama Panda
la source
ok @Panda Pyjama donc pour un code comme celui-ci: float x0 = 0; // coin supérieur gauche de l'image float y0 = 0; float x1 = x0 + ImageWidth; // coin inférieur droit de l'image float 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); } il n'y a aucune possibilité de rencontrer des coordonnées de texture au-delà de l'intervalle (0,1)?
Sepideh Abadpour
1
@sepideh: Bien sûr que non. Vous avez spécifiquement conservé vos coordonnées de texture sur la plage [0, 1]. Ce que vous ne comprenez pas, c'est que vous n'êtes pas obligé de le faire ; vous auriez pu leur faire quelque chose. Aussi, ne postez pas un tas de code dans les commentaires. Si vous souhaitez des éclaircissements, modifiez votre question.
Nicol Bolas
ok merci pour vos conseils sur le passage des codes à ma question. Je cherchais un moyen de formater les codes dans les commandes mais je n'ai pas trouvé !!! Donc, vous voulez dire que rencontrer de telles coordonnées n'est pas un événement possible à l'exécution. Elle est juste spécifiée clairement par le programmeur afin de répéter la texture ou non.
Sepideh Abadpour
1
@sepideh Que signifie "pas un événement possible au moment de l'exécution"? C'est parfaitement bien de changer votre code dans le commentaire pour l'avoir glTexCoord2f(0, 2);par exemple. Cela a une signification bien définie très spécifique dans le code et lorsque le programme est en cours d'exécution. Si vous voyez cela, le programmeur l'a fait intentionnellement car il donne le résultat souhaité.
Joseph Mansfield
2
@sepideh Bien sûr. OpenGL utilise toutes les valeurs que vous lui donnez. Si vous lui donnez des valeurs comprises entre 0 et 1, vous n'obtiendrez jamais rien d'autre.
Joseph Mansfield
5

Oui, vous pouvez rencontrer des coordonnées de texture supérieures 1.0et inférieures à 0.0.

Cela dépend complètement du modèle que vous avez chargé. Normalement, pour chaque sommet, la position, la normale et les coordonnées de texture sont stockées. Dans la plupart des formats de fichiers maillés, les coordonnées de texture ne sont limitées à aucune plage.

Ceci est utilisé pour répéter une texture . Par exemple, pour enjamber une texture quatre temps entre un quad de sommets, les coordonnées de texture seraient 0,0, 0,4, 4,0et 4,4. Sans texture emballage, vous auriez besoin des sommets supplémentaires pour diviser la surface en 4 fois 4 surfaces sous chacune avec les coordonnées de texture 0,0, 0,1, 1,0, 1,1. Moins de sommets entraîne de meilleures performances de rendu.

En règle générale, il n'est pas souhaité que l'utilisateur remarque les bords d'une texture répétée. Par conséquent, les textures répétées peuvent être carrelées dans la plupart des cas. Cela signifie que le bord droit s'estompe de manière transparente vers le gauche et le bord supérieur vers le bas. De cette façon, la transition se fait en douceur et, espérons-le, ne sera pas remarquée par l'utilisateur.

Un sujet plus avancé, mais connexe, consiste à masquer intelligemment le fait que la même texture a été répétée plusieurs fois. Par exemple, le mélange de textures répétées de différentes tailles, par exemple une texture de mur et un décalque de saleté, est une technique courante.

danijar
la source
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,1Voilà une vraie explication pratique! Merci!
Amit Tomar