vendredi 3 février 2012

Les tableaux de coordonnées de texture ou des choses personne ne vous dit

Pour quelque raison, un tas de trucs OpenGL n'est tout simplement pas bien documentés. Oui, j'ai lu le chapitre sur le Livre rouge de texture. Il n'a pas eu une seule référence à glTexCoordPointer (). J'ai aussi lu tout ce que j'ai pu trouver en ligne, et portait les bords droit hors de certains termes de recherche.

Comme vous pouvez le voir ici, ma première tentative de chargement de texture mappée fichiers Wavefront OBJ n'était pas exactement un succès:


La page de manuel pour glTexCoordPointer () vous dit que c'est utilisé pour alimenter un tableau, mais il ne vous dis pas le format du tableau.
Il n'a pas été un échec complet à ce jour - j'ai la texture de chargement et d'être affichés, mais les coordonnées ne sont pas bonnes.

Je pense avoir enfin compris le problème. Le tableau que vous passer dans glTexCoordPointer () doit correspondre à la matrice passée dans glVertexPointer (). Si vous utilisez deux points de cartographie (UV, sans W), alors votre tableau de coordonnées de texture doit avoir 2 / 3 le nombre de GLfloats que votre matrice sommet a, puisque pour chaque sommet de trois flotteurs, vous avez besoin d'un deux- la texture point de coordonnées, et ils ont besoin d'être dans le même ordre.

Assez facile. Sauf que les sommets pourraient ne pas avoir la même texture coordonnées pour chaque polygone qui il est utilisé po

Hmm ... Apple recommande que vous utilisez glDrawElements () pour éviter de dupliquer les sommets. Mais, si un sommet a les coordonnées de texture différente dans différents polygones (et avec des objets complexes, il sera en général), vous avez pour dupliquer les sommets pour chaque ensemble de coordonnées de texture différentes qui correspondent à ce sommet.

C'est un peu déroutant, hein? Rappelez-vous cette image:

Eh bien, dans notre tableau de vertex, le sommet a marqué "A" existe qu'une seule fois dans notre tableau de vertex, même si elle fait partie des six triangles différents. C'est bon pour nous parce que cela réduit la quantité de données en virgule flottante que OpenGL a brasser. Dans nos appels à glDrawElements (), nous nous référons à ce sommet en utilisant une valeur d'index entier qui indique à OpenGL pour saisir que sur vertex spécifiques du tableau de vertex, qui est une recherche rapide.

Maintenant, disons que nous voulons à la texture toute cette maille tous les six triangles-avec un seul UV-mappé image. Il ya des chances, les coordonnées de texture pour sommet A à l'égard de triangle 1 sera différent de celui de la coordonnées de texture pour ce vertex pour le triangle 2 ... et 3, et 4 et 5, et 6. Dans la plupart des situations, nous ne pouvons pas spécifier une seule valeur des coordonnées de texture qui va travailler pour que le sommet dans les six triangles. Il ne peut pas être fait de la façon dont nous nous approchons de cela.

Alors, quelle est la réponse? C'est en fait un gnarley peu. Je vais avoir à analyser toutes les combinaisons uniques des coordonnées des sommets et la texture dans la partie visages des fichiers OBJ et ensuite dupliquer les sommets qui ont plus d'un coordonnée de texture correspondant. Bien sûr, tous les indices qui pointent vers un tel sommet devra être mis à jour pour pointer vers la version correcte de ce sommet, de sorte que lorsque nous appelons glDrawElements (), OpenGL est capable d'attraper la bonne texture coordonnées du polygone en cours d'élaboration .

Je sais maintenant ce que j'ai à faire, c'est juste une question de trouver le temps de le faire. Probablement d'ici la fin du week-end je vais avoir le travail des textures.

Aucun commentaire: