OpenGL: problemes des textures

dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 - 13 août 2005 à 19:45
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 15 août 2005 à 19:10
bonjour,

dans mon projet actuel sous devcpp j'affiche un objet 3D avec opengl en utilisant GL_TRIANGLE_STRIP pour optimiser la vitesse d'affichage....
Mais maintenant j'ai un gros soucis! En effet dans ces bandes de polygones, tous les triangles ne doivent pas avoir la meme texture! Donc j'utilisais glBindTexture() pour choisir la texture courante, mais celle ci ne focntionne pas apperemment entre les glBegin() et glEnd()!!
Comment dois je faire alors??

18 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
13 août 2005 à 19:52
Séparer les polygones suivant leur texture. Seul solution :)
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
13 août 2005 à 20:02
salut!

Nan je veux pas! lol! J'y ai pensé mais ca me fais perdre mon gain de vitesse d'affichage....
Mince il y a pas d'autres solutions alors?

En attendant je vais choisir la methode de luthor. Merci!
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
13 août 2005 à 20:07
Ben, l'autre solution, tu mets tout ca dans une liste d'affichage, si
c'est possible. Comme ca, tu laisses openGL adapter le code comme il
l'entend. :)



cyao
0
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
13 août 2005 à 22:33
Moi je verrais autre chose : une texture unique pour tous tes
triangles, mais cette texture, plus grosse que celles que tu utilises
actuellement, contiendrait les mêmes images.

En jouant sur glTexCoord2d tu dois pouvoir changer l'image :)

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
13 août 2005 à 22:58
qu'est ce que ca changerais une liste d'affichage? Je pourrias toujours pas mettre un glBindTexture() entre glBegin et glEnd()...

Funto66-> Mais oui c'est une tres bonne idée....mais tres chiante a mettre en place...
Parce que tout ca c'est pour un editeur de map...alors des textures différente il y en aura bcp bcp! et ca fait une image enorme! Donc je sais pas si j'y gagnerais en vitesse...

Sinon ca yest j'ai fait en sorte que mes bandes de polys soient decoupées a chaque changement de texture...
Ca marche pas tout a fait parce que j'ai des polygones manquants aux jonctions entres 2 textures differentes...mais bon je dezvrais pouvoir resoudre ce probleme...
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
13 août 2005 à 23:13
Une liste d'affichage n'est pas seulement des lignes de code
préenregistrées. OpenGL "compile" les commandes ce qui lui évite
d'effectuer les calculs sur les sommets au moment de l'appel puique
tous les sommets on deja leur position ainsi qu'une coordonnée de
texture définie, etc...



Mais je sais pas à quel degré il fait tout ca, donc oui peut etre que
ca ne changerait pas grand chose. De toute facon, c'est pas faisable
pour un éditeur.



++
0
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
14 août 2005 à 00:46
Boah tant que ça reste un éditeur de maps, à quoi bon optimiser à fond...



Et puis quitte à optimiser, regarde du côté des (compiled si possible) vertex arrays ;)

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
14 août 2005 à 13:11
Oui pour l'editeur ca va... mais il servira a créer des map pour un jeu! Donc c'est toujours le meme probleme...il faut que ca soit optimisé!
Sinon j'afficherais pleins de triangles séparés et non des bandes de triangles liés....ca serait bcp moins casse tete...et surement moins rapide!
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
14 août 2005 à 13:29
Pas forcement moins rapide car la carte video a de la memoire cache et
ne reeffectue pas les transformations des vertex calculés recemment
(d'ou theoriquement strip >> list).

Tu peux oublier le triangle_strip et optimiser la triangle_list pour le cache de la CG.

Je m'etais pris la tête pour faire un algorithme qui cree des
triangles_strip a partir de triangle_list, et je n'ai vraiment pas
gagné grand chose, genre 1%.
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
14 août 2005 à 18:48
je comprends ce que tu veux dire ici:
"Tu peux oublier le triangle_strip et optimiser la triangle_list pour le cache de la CG."

Comment optimiser le cache? et qu'est ce que tu entends par triangle_list?
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
14 août 2005 à 19:16
Liste de triangle (mon "triangle_list"):


Les indices pris 3 par 3 definissent les triangles.


1,2,3,4,5,6 => 2 triangles 1,2,3 et 4,5,6





Triangle strip:


3 indices consecutifs definissent un triangle.


1,2,3,4,5,6 => 4 triangles 1,2,3 ; 2,3,4 ; 3,4,5 et 4,5,6





Strip:


Niveau place dans la memoire, il est clair que le strip est plus avantageux.


En plus, quand le triangle 1,2,3 est affiché, la CG n'a plus a
reexecuter les vertex shaders pour les vertex 2 et 3 (du triangle
2,3,4) car elle les a forcement en memoire cache.





List:


Plus gourmand en place, mais pas forcement lent.

Pour afficher les 4
triangles 1,2,3 ; 2,3,4 ; 3,4,5 et 4,5,6, il faut "donner" au mode list:


1,2,3 ; 2,3,4 ; 3,4,5 et 4,5,6.

Dans ce cas, l'affichage du premier
triangle implique le calcul sur les vertex 2 et 3, calculs qui ne seront
pas reeffectués pour afficher le 2eme triangle (2,3,4).



Optimiser la triangle_list pour le cache = faire en sorte que les
indices identiques soient proche les uns des autres dans la
triangle_list
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
14 août 2005 à 22:06
Funto66 said "Moi je verrais autre chose : une texture unique pour tous tes
triangles, mais cette texture, plus grosse que celles que tu utilises
actuellement, contiendrait les mêmes images."



Et pour le tiling, tu es obligé de changer le pixel shader (2 lignes
-> 5 lignes), donc ce n'est pas si rentable pour un editeur de map
(dont les coordonnées textures depassent parfois 1).
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
15 août 2005 à 11:50
Pourquoi veux tu des coordonnées qui dépassent 1 ? Elles ne dépasseraient pas 1. Je comprends donc pas ce que tu veux dire.



Dernière question, qu'est ce que tu appelles le tiling ? (jamais entendu ce terme)
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
15 août 2005 à 12:08
Si tu veux afficher un rectangle ou tu as n fois la texture suivant u et m fois la texture suivant v...
Par exemple, tu as un seul carreau pour decorer le mur rectangulaire de ta salle de bain. Or ta salle de bain a n carreaux suivant x et m suivant y. Au lieu d`avoir le grand carreau etire sur tout le mur, tu mets les vertices a:

(x,y,z, u,v)
(0,0,0, 0,m)
(1,0,0, n,m)
(1,1,0, n,0)
(0,1,0, 0,0)

Essaie sur tes objets tu verras.

Je ne connais pas le terme pour cette technique. Je dis tiling car c`est "carrelage" en anglais. Mais surtout que j`ai deja entendu ca quelque part (creation moteur 2D je crois).
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
15 août 2005 à 14:53
Oui, si le mode GL_REPEAT a été définie, la texture sera répétée. Mais
je viens de comprendre a la lumière de ton explication ;) ton post
précédent. Oui pour le tiling ca va pauser problème, mais c'est pas sur
qu'il est besoin de répéter une texture.
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
15 août 2005 à 18:31
Bon finalement malgré le TRIANGLE_STRIP j'ai reussi a changé de textures en coupant les bandes de polys achaqsue fois que je cnageais de texture. Ca fut bien prise de tete a cause de bugs de polys manquant au niveau des transitions entre 2 textures....mais tout cela a finalement été réglé!! Ety pour RIEN! finalement! puisque je mesuis rendu compte que j'avais un probleme que je ne pouvais pas resoudre dans l'application de mes texture qui donnait un effet de symétrie aux bord de chaque groupe de polys ou j'appliquais la texture....bref c'est hyper dur a expliquer comme ca, il vous faudrais des screenshots et tout le reste....

Donc voila ce que je decide:

Je vais organisé mes polys comme dans un fichier ase ou 3ds ( si vous voyez...) et en fait au niveau de l'affichage ca se passera comme le dit Galmiza dans la partie "List". Ca mettra fin a mon casse tete et puis ca prendra un petit peu plus de meoire mais bon ca ira...

J'ai toujours pas compris comment optimisé la triangle list, ce que tu veut dire par "faire en sorte que les indices identiques soient proche les uns des autres dans la triangle_list"
Ce que je sais c'est que dans ma liste de sommets il y en a aucun qui sont confondus. Les polys seront eux contiendront les indices des sommets qui les forment, donc certains poly auront des indices en commun...

En tout cas merci bcp a tous les 3 pour tous ces conseils!
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
15 août 2005 à 18:32
ne prenez pas en compte le smiley au depart! il s'est mis tout seul! sans que j'appuis sur le bouton....
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
15 août 2005 à 19:10
Aucuns de tes sommets ne sont confondus ? Combien de vertex a un de tes cubes ? 8 ou 24 ?


Effectivement dans le vertex buffer, il n`y a aucune donnee qui se repete. Mais certains vertex peuvent avoir la meme position mais pas les meme normale et coordonnees textures. Il sont a differencier dans le vertex buffer.


Dans l`index buffer, on trouve de tres nombreux indices en commun.
Disons qu`une carte graphique a un cache de 6 resultats de transformation (de vertex evidemment).
Si tu affiches les triangles 1,2,3 ; 4,5,6 les 6 resultats de leur transformation par le vertex shader sont dans le cache.


Si ensuite tu veux afficher 3,6,2, aucun calcul de vertex ne sera effectue car la carte video a toujours en memoire le resultat des transformation de 3,6 et 2 (1,4 et 5 aussi d`ailleurs).



Par contre, si le cache etait de 2 seulement, apres l`affichage de 1,2,3 et 4,5,6, la carte video n`aurait pu garder que les resulats des transformations de 5 et 6 (les 2 derniers quoi).
Et l`affichage de 3,6,2 aurait donc implique le recalcul des transformations de 3 et 2 (mais pas 6 qui est dans le cache).


Donc optimiser pour le cache revient a minimiser les calculs de vertex shader en faisant en sorte d`afficher consecutivement les faces aillant des vertex en commun .



Imagine que tu doives citer 200 series de 3 mots consecutifs a un gars qui a une memoire de 6 mots. Il ne connais aucun mot. Par contre, quand tu lui donnes la definition d`un mot, il la retient jusqu`a ce que tu lui ai donne 6 definitions supplementaires.
Il lui faut 10 secondes pour apprendre un mot et donc etre content. Tu ne peux continuer ta lecture des mots que s`il est content.


Dans quel ordre vas-tu citer les triplets de mots pour que tu en finisses le plus tot possible ?


Ans: tu vas faire en sorte qu`il connaisse deja les mots que tu lui dis. Pas evident avec une memoire de 6 mots...
0
Rejoignez-nous