web-dev-qa-db-fra.com

Comment fonctionnent les coordonnées de texture opengl?

Je sais que je dois faire un des appels suivants avant chaque appel à glVertex:

glTexCoord(0,0); 
glTexCoord(0,1); 
glTexCoord(1,1); 
glTexCoord(1,0); 

Mais je n'ai aucune idée de ce qu'ils signifient. Je sais cependant que si je multiplie (ou est-ce que cela divise?) Le côté droit (ou est-ce tout le monde?) Par deux, ma texture se dilate et si je fais le contraire, ma texture se répète deux fois. J'ai réussi à coder un atlas de texture en appliquant des opérations jusqu'à ce qu'il fonctionne. Mais j'ai une bonne idée de ce qui se passe. Pourquoi les diviser affecte-t-il l'image et pourquoi les inverser la reflète-t-il? Comment fonctionnent les coordonnées de texture?

56
mk.

Les coordonnées de texture spécifient le point dans l'image de texture qui correspondra au sommet pour lequel vous les spécifiez. Pensez à une feuille de caoutchouc rectangulaire avec votre image de texture imprimée, où la longueur de chaque côté est normalisée à la plage 0-1. Supposons maintenant que vous vouliez dessiner un triangle en utilisant cette texture. Vous prendriez 3 épingles et les placeriez dans la feuille de caoutchouc aux positions de chacune de vos coordonnées de texture souhaitées. (Dites [0, 0], [1, 0] et [1, 1]), puis déplacez ces broches (sans les retirer) aux coordonnées de sommet souhaitées (Dites [0, 0], [0.5, 0] et [ 1, 1]), de sorte que la feuille de caoutchouc soit étirée et l'image déformée. C'est essentiellement ainsi que fonctionnent les coordonnées de texture.

Si vous utilisez des coordonnées de texture supérieures à 1 et que votre texture est définie pour se répéter, c'est comme si la feuille de caoutchouc était de taille infinie et que la texture était recouverte de mosaïque. Par conséquent, si vos coordonnées de texture pour deux sommets étaient 0, 0 et 4, 0, alors l'image devra être répétée 4 fois entre ces sommets.

enter image description here @ b1nary.atr0phy Image pour tous les penseurs visuels!

119
geofftnz

OpenGL utilise une texturation inverse. Il prend les coordonnées de l'espace mondial (X, Y, Z) à l'espace de texture (X, Y) à l'espace discret (U, V), où l'espace discret est dans le domaine [0,1].

Prenez un polygone, pensez-y comme une feuille de papier. Avec ça:

glTexCoord(0,0); 
glTexCoord(0,1); 
glTexCoord(1,1); 
glTexCoord(1,0); 

Vous dites à OpenGL de dessiner sur toute la feuille de papier. Lorsque vous appliquez des modifications, votre espace de texturation se modifie en fonction des coordonnées données. C'est pourquoi par exemple, lorsque vous divisez, vous obtenez deux fois la même texture, vous dites à OpenGL de mapper la moitié de votre feuille, au lieu de la feuille de papier entière.

9
Cristina

Le chapitre 9 du Livre rouge explique cela en détail et est disponible gratuitement en ligne.

http://www.glprogramming.com/red/chapter09.html

Les coordonnées de texture mappent x, y à l'espace 0-1 dans l'espace de texture largeur et hauteur. Celui-ci est ensuite étiré comme une feuille de caoutchouc sur les triangles. Il est mieux expliqué avec des images et le Livre rouge le fait.

6
dorbie

Pour les textures d'images 2D, 0,0 en coordonnées de texture correspond au coin inférieur gauche de l'image et 1,1 en coordonnées de texture correspond au coin supérieur droit de l'image. Notez que le "coin inférieur gauche de l'image" n'est pas au centre du pixel inférieur gauche, mais au bord du pixel.

Également intéressant lors du téléchargement d'images:

8.5.3 Structure d'image de texture

L'image de texture elle-même (référencée par les données) est une séquence de groupes de valeurs. Le premier groupe est le coin arrière inférieur gauche de l'image de texture. Les groupes suivants remplissent des rangées de largeur de gauche à droite; les rangées de hauteur sont empilées de bas en haut pour former une seule tranche d'image bidimensionnelle; et les tranches de profondeur sont empilées de l'arrière vers l'avant.

Notez que la plupart des formats d'image ont les données commencent en haut et non en bas.

3
Andreas Haferburg