Optim OpenGL

Salut,

je me pose une question d’optim

J’ai un quadrillage a affiche.
J’ai deux choix:

Je cree une list qui me dessine un carre en 0,0 de cote 1
pour chaque case je gltranslate(X, Y) et j’appelle la liste pui je glTranslate(-X, -Y)

je dessine directement chaque carre en X, Y de cote 1 sans utiliser une liste.

Pour l’appli que je developpe ca ne va pas changer grand chose mais j’aimerai bien savoir.

Merci ++ fat

et pourquoi ne pas dessiner des lignes qui se croisent? Enfin c’est comme ca que j’aurais fait moi…

[quote name=’[PERE]Cil’ date=’ 2 Aug 2005, 21:49’]et pourquoi ne pas dessiner des lignes qui se croisent? Enfin c’est comme ca que j’aurais fait moi…
[right][post=“382820”]<{POST_SNAPBACK}>[/post][/right][/quote]

Le case sont texturees. C’est pour faire un bomberman. :P)

Sinon effectivement la question ne se posait pas.

++ fat

J’imagine que tes cases utilisent une certaine série de texures, on va dire par exemple trois textures : {mur, sol, bonus} (je simplifie). Le mieux est de faire une liste qui contienne toutes les cases, tu la génères avec une boucle avec les coordonnées en dur de sorte qu’en affichant la liste en 0,0 ça t’affiche toute la grille.

Ouais mais et les textures alors ? Bah tu utilises ce qu’on appelle un atlas, c’est à dire que tes trois textures, on va dire qu’elles font 64x64, ben tu les places dans une grosse texture de 128x128 ou 256x64 comme tu préfères. Et tu adaptes les coordonnées uv en fonction.

Ce que j’entends par adapter les coordonnées de textures, c’est que si tu as un atlas de 256x64 qui contient tes textures dans l’ordre suivant : MSB? (? c’est la texture inutilisée, pour que l’atlas aie une largeur qui soit une puissance de 2), quand tu veux afficher une case avec la texture S (sol), tu utilises les coordoonées suivantes:

haut gauche : 0.25, 0.0
haut droite : 0.5, 0.0
bas gauche : 0.25, 1.0
bas droite : 0.5, 1.0

L’intérêt de tout ça c’est que ainsi toute ta grille peut être affichée d’un coup par OpenGL. Ah oui, tu vas avoir des problèmes avec le filtrage, qui te forceront à légèrement adapter tes coordonées et à générer les mipmaps à la main, mais je te laisse découvrir :stuck_out_tongue:

Bon dans ce cas précis, c’est de l’enculage de mouches, si t’avais 200 grilles à afficher, ça pourrait avoir un impact positif sur les performances, ici ça va juste faire que dalle. En plus de ça, il me semble avoir lu qu’openGL est un peu moins sensible à ce genre d’optimisations que Direct3D lorsque le nombre d’objets est relativement faible.

Mais bon, quitte à apprendre, autant apprendre les bons principes :stuck_out_tongue: J’espère aussi ne pas raconter de conneries, on fait comme ça en DirectX, j’ai juste transposé en OpenGL mais je n’ai pas beaucoup d’expériences pratiques en OpenGL.

Et aussi, si ça te semble compliqué, ne te laisse pas impressionner et utilise l’une des deux méthodes que tu as évoqué, les deux marcheront et te permettront d’avancer dans ton projet. Rien n’interdit d’y revenir plus tard pour chipoter :stuck_out_tongue:

[quote name=‹ Drealmer › date=’ 3 Aug 2005, 08:57’]J’imagine que tes cases utilisent une certaine série de texures, on va dire par exemple trois textures : {mur, sol, bonus} (je simplifie). Le mieux est de faire une liste qui contienne toutes les cases, tu la génères avec une boucle avec les coordonnées en dur de sorte qu’en affichant la liste en 0,0 ça t’affiche toute la grille.

Ouais mais et les textures alors ? Bah tu utilises ce qu’on appelle un atlas, c’est à dire que tes trois textures, on va dire qu’elles font 64x64, ben tu les places dans une grosse texture de 128x128 ou 256x64 comme tu préfères. Et tu adaptes les coordonnées uv en fonction.

Ce que j’entends par adapter les coordonnées de textures, c’est que si tu as un atlas de 256x64 qui contient tes textures dans l’ordre suivant : MSB? (? c’est la texture inutilisée, pour que l’atlas aie une largeur qui soit une puissance de 2), quand tu veux afficher une case avec la texture S (sol), tu utilises les coordoonées suivantes:

haut gauche : 0.25, 0.0
haut droite : 0.5, 0.0
bas gauche : 0.25, 1.0
bas droite : 0.5, 1.0

L’intérêt de tout ça c’est que ainsi toute ta grille peut être affichée d’un coup par OpenGL. Ah oui, tu vas avoir des problèmes avec le filtrage, qui te forceront à légèrement adapter tes coordonées et à générer les mipmaps à la main, mais je te laisse découvrir :stuck_out_tongue:

Bon dans ce cas précis, c’est de l’enculage de mouches, si t’avais 200 grilles à afficher, ça pourrait avoir un impact positif sur les performances, ici ça va juste faire que dalle. En plus de ça, il me semble avoir lu qu’openGL est un peu moins sensible à ce genre d’optimisations que Direct3D lorsque le nombre d’objets est relativement faible.

Mais bon, quitte à apprendre, autant apprendre les bons principes :stuck_out_tongue: J’espère aussi ne pas raconter de conneries, on fait comme ça en DirectX, j’ai juste transposé en OpenGL mais je n’ai pas beaucoup d’expériences pratiques en OpenGL.

Et aussi, si ça te semble compliqué, ne te laisse pas impressionner et utilise l’une des deux méthodes que tu as évoqué, les deux marcheront et te permettront d’avancer dans ton projet. Rien n’interdit d’y revenir plus tard pour chipoter :stuck_out_tongue:
[right][post=« 382887 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Merci du tuyau,

effectivement je n’avais pas penser à faire une liste precompilée pour chaque map … jvé voir suivant mon humeur!! :-p

Merci ++ fat

Je plussoie dreamler, le meilleur du point de vue optimisation et de faire une liste precompilé avec le quadrillage entier. Charger qu’une seule texture plus grande devrait aussi permettre d’economiser un peu de ressources mais c’est moins sur.

Ca bouffe tant que ca, de switcher la texture en ram pour le rendu?

Pour un scenegraph, il vaut mieux donc trier tous les éléments par les matériaux qui les composent?

Bah pour ce que j’ai fait en projet de fin d’année OpenGL, on chargeait une seule texture, et on essayait de texturer de plusieurs methodes un fichier wavefront non texturé. Donc suivant comment on texturait, certaines parties de la textures étaient juste invisibles. Niveau perf’, ça tournait nickel.