Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: 2D isométrique, VertexArray  (Lu 13946 fois)

0 Membres et 1 Invité sur ce sujet

math77

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
2D isométrique, VertexArray
« le: Août 21, 2013, 07:58:38 pm »
Bonjour,

Ayant lu la plupart des sujets présent sur ce forum et d'autres concernant la manière la moins coûteuse en performances d'afficher un grand nombre de tile, j'aimerai vous poser quelques questions :)

J'ai lu que les VertexArray sont beaucoup plus rapides que les RenderTexture ou Sprites normaux : mais la limite est que l'on ne peut utiliser qu'une seule texture.
Le problème est que on ne peut pas faire un grand tileset regroupant toutes les tuiles possibles (non supporté par les cartes graphiques plus anciennes) et que je ne peux pas mettre plusieurs VertexArray par couche (car sinon les tuiles ne se superposent pas dans le bon ordre et le résultat est horrible).
L'autre solution était de faire un VertexArray par couche, mais là encore, je prévois beaucoup de tiles différents, et je ne peux pas savoir quels tiles vont être mis sur la map (par l'éditeur de map), donc je ne peux pas prévoir de tileset... :/

Auriez vous des réponses ? Et pour ceux qui ont déjà rencontrés ce type de problème pouvez-vous m'éclaircir ? :)

Merci beaucoup

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 2D isométrique, VertexArray
« Réponse #1 le: Août 21, 2013, 10:22:44 pm »
Citer
sinon les tuiles ne se superposent pas dans le bon ordre et le résultat est horrible
Tes tuiles se superposent ?
Laurent Gomila - SFML developer

math77

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : 2D isométrique, VertexArray
« Réponse #2 le: Août 21, 2013, 11:48:15 pm »
Oui ce sont des tuiles qui peuvent etre avec un peu de relief et donc elles ont une profondeur (fausse 3D) :)

Exemple : https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcT73qRSV4Fn0ovkG-pDQ9h1LvChSc2kOb5T4ZdPpMlbHXrou9oR2N9aADf1NQ

Et si j'utilise un vertexArray par tuile différente, certaines qui sont derrière normalement se retrouveront devant et vice versat :/

math77

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : 2D isométrique, VertexArray
« Réponse #3 le: Août 22, 2013, 03:44:17 pm »
Voila en image le problème :

Une map basique :



Si je fais un VertexArray par texture, cela me donne ça :

Pour la pierre :



Pour l'eau :



Et au final j'aurai ça comme résultat (pas bon, l'eau est par dessus le bloc) :



Le problème étant que je ne sais pas quel bloc l'utilisateur posera sur la map (avec l'éditeur de map) et donc je ne peux pas prévoir de tileset spécial pour le sol...

Merci d'avance :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 2D isométrique, VertexArray
« Réponse #4 le: Août 22, 2013, 03:56:37 pm »
Là j'avoue que je n'ai pas de solution miracle, c'est un cas compliqué à gérer.

Simple curiosité, tu as combien de tuiles différentes en tout ?
Laurent Gomila - SFML developer

math77

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : 2D isométrique, VertexArray
« Réponse #5 le: Août 22, 2013, 04:01:06 pm »
Pour l'instant pour les tuiles de sol, j'en ai une quinzaine environ, mais je compte en faire encore plus ;)

Sinon j'ai pensé à faire des RenderTexture de par exemple 800px par 800px et les coller les unes contre les autres, pour ce qui est statique, cela permet de charger qu'une fois et apres juste afficher la RenderTexture, et lorsque on se déplace, rajouter une RenderTexture, etc.

Est-ce une bonne idée ? :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 2D isométrique, VertexArray
« Réponse #6 le: Août 22, 2013, 04:10:53 pm »
Citer
Pour l'instant pour les tuiles de sol, j'en ai une quinzaine environ, mais je compte en faire encore plus
Même si tu en as plus, ça ne tient pas dans une texture de 1024x1024 ?

Citer
Sinon j'ai pensé à faire des RenderTexture de par exemple 800px par 800px et les coller les unes contre les autres, pour ce qui est statique, cela permet de charger qu'une fois et apres juste afficher la RenderTexture, et lorsque on se déplace, rajouter une RenderTexture, etc.
Ca marche oui, mais attention à ne pas saturer ta mémoire graphique si tu as de grands niveaux.
Laurent Gomila - SFML developer

math77

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : 2D isométrique, VertexArray
« Réponse #7 le: Août 22, 2013, 04:16:24 pm »
Euh mes textures font environ 90 par 60, donc je peux en mettre beaucoup mais j'ai lu que certaines cartes graphiques ne supportent que 512*512 :/

Mais l'autre problème c'est qu'elles ne font pas toutes la même taille donc pour faire un tileset c'est assez compliqué.

Ou sinon j'avais pensé, créer le tileset au moment du chargement de la map, avec uniquement les tiles présents sur la map (ça devrait passer niveau quantité) mais je ne suis pas sur que ça marche :/

Sinon entre les renderTextures de 800*800 et les VertexArray, qu'est ce qui est le plus performant ? :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 2D isométrique, VertexArray
« Réponse #8 le: Août 22, 2013, 04:23:17 pm »
Citer
j'ai lu que certaines cartes graphiques ne supportent que 512*512
Dans ce cas ne prévois pas de RenderTexture de 800x800 :P

Honnêtement je ne suis pas sûr que les cartes ne supportant que 512x512 soient encore très présentes. On peut sans doute relever un peu le niveau à 1024x1024 de nos jours.

Citer
Mais l'autre problème c'est qu'elles ne font pas toutes la même taille donc pour faire un tileset c'est assez compliqué.
C'est gérable. Il suffit d'ajouter la taille des tuiles, soit dans un fichier séparé soit encodé dans un pixel à côté de chaque tuile.

Citer
Ou sinon j'avais pensé, créer le tileset au moment du chargement de la map, avec uniquement les tiles présents sur la map (ça devrait passer niveau quantité)
L'utilisateur ne peut pas mettre une tuile de chaque sorte sur sa carte ?

Citer
mais je ne suis pas sur que ça marche
Pourquoi pas ?

Citer
Sinon entre les renderTextures de 800*800 et les VertexArray, qu'est ce qui est le plus performant ?
Ca c'est une question sans réponse. Les vertex arrays sont toujours conseillés de manière générale, mais après si tu veux comparer les performances ça dépend trop de chaque contexte.
Laurent Gomila - SFML developer

math77

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : 2D isométrique, VertexArray
« Réponse #9 le: Août 22, 2013, 04:30:20 pm »
Citer
L'utilisateur ne peut pas mettre une tuile de chaque sorte sur sa carte ?
En fait dans l'éditeur de map l'utilisateur choisit ses tiles (qui seront rangés par catégorie donc séparés)
Ensuite dans le jeu, son personnage se déplace dessus.

Je pensais sinon au chargement de la map (dans le jeu) assembler les tiles présent sur la map dans un tileset avec la méthode que tu viens de dire dans une RenderTexture, puis utiliser cette RenderTexture comme tileset pour afficher la map avec les VertexArrays. Est-ce possible ? :)

Mais pour l'autre méthode, on appelle tous les draw() qu'une seule fois ou presque puisqu'après on a juste à afficher la RenderTexture, cela peut faire gagner en performances ? :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 2D isométrique, VertexArray
« Réponse #10 le: Août 22, 2013, 04:53:04 pm »
Citer
Je pensais sinon au chargement de la map (dans le jeu) assembler les tiles présent sur la map dans un tileset avec la méthode que tu viens de dire dans une RenderTexture, puis utiliser cette RenderTexture comme tileset pour afficher la map avec les VertexArrays. Est-ce possible ?
J'avais bien compris. Oui c'est possible.

Citer
Mais pour l'autre méthode, on appelle tous les draw() qu'une seule fois ou presque puisqu'après on a juste à afficher la RenderTexture, cela peut faire gagner en performances ?
Ca dépend par rapport à quoi ;)
Laurent Gomila - SFML developer

math77

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : 2D isométrique, VertexArray
« Réponse #11 le: Août 22, 2013, 05:01:32 pm »
Par rapport à l'autre méthode plus haute :)

Donc j'ai le choix :

1- j'affiche la couche avec un VertexArray qui prend comme texture le tileset créé par la RenderTexture.
2- je créé des RenderTexture pour toute la couche (et je la divise en partie de 1024 par 1024 par exemple^^) et une fois créé je n'ai plus qu'à les afficher jusqu'à ce que le perso bouge et la rebelotte, on recommence à créé des RenderTextures etc.

Quelle méthode semble la plus optimisée ? :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 2D isométrique, VertexArray
« Réponse #12 le: Août 22, 2013, 08:19:30 pm »
Si tu peux faire quelque chose avec des vertex arrays, préfère le à la solution à base de RenderTexture.

Mais bon sinon faut tester, dans l'absolu ça se vaut.
Laurent Gomila - SFML developer

Hypnéos

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Re : 2D isométrique, VertexArray
« Réponse #13 le: Août 23, 2013, 01:06:26 pm »
Je ne sais pas si cela peut aider, mais les primitives d'un VertexArray sont rendues dans l'ordre dans lequel elles sont entrées.

donc, si tu enregistre les tuiles les plus éloignées de la caméra en premier, et les plus proches en dernier; elles devraient se superposer correctement.

Je ne suis pas sur à 100% du comportement d'openGL, mais je pense que ça devrait marcher...

math77

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : 2D isométrique, VertexArray
« Réponse #14 le: Août 23, 2013, 05:10:45 pm »
@Laurent : Je vais essayer avec les VertexArray mais je ne suis pas sur du résultat :/

@Hypnéos : En fait ta méthode est bonne à partir du moment où un seul vertexArray affiche la meme couche. Quand il y en a plusieurs (par exemple 1 par texture), comme sur la photo, on ne peut pas afficher un bout du vertexArray puis un bout de l'autre etc., on doit forcément tout afficher d'un coup ...

 Donc du coup les mêmes tiles sont bien affichées, mais des qu'il y en a plusieurs, c'est là qu'il y a un problème :'(