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

Auteur Sujet: Définir un ordre d'affichage par vertex.  (Lu 13577 fois)

0 Membres et 1 Invité sur ce sujet

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Définir un ordre d'affichage par vertex.
« le: Juillet 04, 2013, 11:02:52 am »
Voila je voudrais savoir si il serait possible (vu que tu utilises opengl) de faire comme le fait opengl c'est à dire définir un ordre d'affichage par vertex pour que certaines tiles d'une tilemap soient affiché avant ou après certaines tiles d'une autre tilemap.

Merci de votre réponse.

Nexus

  • SFML Team
  • Hero Member
  • *****
  • Messages: 6286
  • Thor Developer
    • Voir le profil
    • Bromeon
Re : Définir un ordre d'affichage par vertex.
« Réponse #1 le: Juillet 04, 2013, 11:22:13 am »
Ce n'est pas directement possible, tu devrais dessiner les vertexes dans l'ordre que tu veux. Donc il faut utiliser plusieurs vertex arrays.
Zloxx II: action platformer
Thor Library: particle systems, animations, dot products, ...
SFML Game Development:

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Définir un ordre d'affichage par vertex.
« Réponse #2 le: Juillet 04, 2013, 11:33:25 am »
C'est techniquement possible (il suffit d'ajouter une coordonnée Z à sf::Vertex et d'activer le depth buffer), et ça a déjà été longuement débattu sur le forum anglais.

Pour l'instant ce n'est pas prévu, mais disons que je ne suis pas non plus spécialement contre.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #3 le: Juillet 04, 2013, 11:42:56 am »
Ok bah alors je vais essayer de faire comme tu dis, ajouter une coordonnée Z à mes sf::vertex et activer le depth buffer.

Merci.  :)

Nexus

  • SFML Team
  • Hero Member
  • *****
  • Messages: 6286
  • Thor Developer
    • Voir le profil
    • Bromeon
Re : Définir un ordre d'affichage par vertex.
« Réponse #4 le: Juillet 04, 2013, 11:49:29 am »
En fait ce n'est pas si facile, par exemple il y a des problèmes avec la composante alpha. Cherche les fils de discussion anglais ;)
Zloxx II: action platformer
Thor Library: particle systems, animations, dot products, ...
SFML Game Development:

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #5 le: Juillet 04, 2013, 12:00:16 pm »
Arf ok.  :-\
Je vais aller faire un tour sur le forum anglais, je n'y avais jamais été mais ça pourrait être intéressant d'y aller jeter un coup d’œil. 

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #6 le: Juillet 04, 2013, 12:13:44 pm »
Voilà j'ai trouvé, tu parles bien de ce fils de discutions là ?

http://en.sfml-dev.org/forums/index.php?topic=6817.msg44921#msg44921

Je n'utilise pas de sprites semi-transparent donc ça ne devrait pas poser de problèmes mais bon je verrai bien ça quand j'implémenterai ça.
Au pire, je repasserai à mon ancien système qui dessine les sprite un par un, c'est plus lent car plus d'appel à draw mais bon..., pas vraiment le choix dans mon cas.

PS : et hum quel problème ça cause exactement avec les sprites semi-transparents ?



« Modifié: Juillet 04, 2013, 12:16:51 pm par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Définir un ordre d'affichage par vertex.
« Réponse #7 le: Juillet 04, 2013, 12:39:20 pm »
Non c'était une autre discussion, bien plus fournie.

Citer
et hum quel problème ça cause exactement avec les sprites semi-transparents ?
Si tu affiches un sprite semi-transparent avant ce qui se trouve derrière, tu ne verras pas ce qui se trouve derrière. Le Z-buffer n'a pas la notion de semi-transparence.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #8 le: Juillet 04, 2013, 01:03:59 pm »
Citer
Si tu affiches un sprite semi-transparent avant ce qui se trouve derrière, tu ne verras pas ce qui se trouve derrière. Le Z-buffer n'a pas la notion de semi-transparence.

Ha, ok, c'est donc pour ça que parfois j'avais des sprites qui ne s'affichaient pas avec opengl et ou j'avais mal gommé le gris autour de mes sprites pour rendre le tour de mes sprites transparent au format png.
Car les fonds d'image de rendu blender sont gris, je ne sais pas si il y a moyen de changer ça pour que blender rendent mes objets en 3D sur fond transparent, bref...

Mais pour tout ce qui est transparent a 100% ça marche quand même non ?

Bref je n'utilise la semi-transparence que pour tout ce qui est lumière/ombre ou là je n'utilise pas de tilemap mais une rendertexture plutôt, pour la semi-transparence, c'est mieux.  :)

PS : ha oui je vois ce que tu veux dire, tu veux dire que si un objet est devant un autre, même si l'objet de devant est transparent, le Depthbuffer va faire comme si l'objet de derrière était caché et donc ne va pas l'afficher. (Vu que ça ne fait q'un bête test que sur la profondeur des pixels et non la transparence.)

PS 2 : dommage, un zBuffer qui ferai aussi un test sur l'opacité des pixels serait intéresant, mais à part faire ça avec un shader il n'y a surement pas d'autres options. (Ou je me trompe ?)
« Modifié: Juillet 04, 2013, 01:11:27 pm par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #9 le: Juillet 04, 2013, 01:15:43 pm »
Ok bah alors je vais plutôt revenir à mon ancien système avec un seul draw par sprite parceque en effet sans sahders ça ne marchera pas et je veux que mon appli marche aussi sur des pc ne supportant pas le langage GLSL.
Je pensais que le depthtest faisait aussi un test sur l'opacité des pixels mais ce n'est pas le cas.  :-\
Bref, oublie ma proposition, avec des sprites transparents ou semi-transparent ça ne marchera pas.
« Modifié: Juillet 04, 2013, 01:22:34 pm par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #10 le: Juillet 04, 2013, 01:45:50 pm »
Sinon, j'ai trouvé un article en Anglais qui traite sur le sujet : http://www.sjbaker.org/steve/omniv/alpha_sorting.html

Je pense que je vais essayer avec un glAlphaTest pour ne pas écrire les pixels totalement transparent dans le zBuffer, vu que je n'utilise pas de MipMap ou bien de linear mode, d'après cet article, ça ne devrait pas poser de problèmes.

Nexus

  • SFML Team
  • Hero Member
  • *****
  • Messages: 6286
  • Thor Developer
    • Voir le profil
    • Bromeon
Re : Définir un ordre d'affichage par vertex.
« Réponse #11 le: Juillet 04, 2013, 01:55:08 pm »
Est-ce que trier les objets dans une liste avant dessiner n'est pas une option? Ca serait beaucoup plus simple, et tu n'aurais pas besoin de modifier SFML.

A propos, les ordinateurs qui n'offrent pas GLSL sont très anciens (une décennie et plus).
Zloxx II: action platformer
Thor Library: particle systems, animations, dot products, ...
SFML Game Development:

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #12 le: Juillet 04, 2013, 02:35:28 pm »
Citer
st-ce que trier les objets dans une liste avant dessiner n'est pas une option? Ca serait beaucoup plus simple, et tu n'aurais pas besoin de modifier SFML.
Si mais l'inconvénient est que c'est plus lent à dessiner qu'une tilemap car plus d'appels à draw.

Au sinon j'ai besoin de modifier SFML pour faire ça ?

En rajoutant juste ces quelques lignes de code dans mon code ça ne marcherait pas ?

glEnable(GL_DEPTH_TEST);
glAlphaFunc ( GL_GREATER, 0.1 ) ;
glEnable ( GL_ALPHA_TEST ) ;
 

Ainsi je dessine toutes les tilemap (donc je limite mes appels à draw vu que tout mes sprites qui pointeront vers la même texture seront envoyé d'un seul coup à opengl) et je mets une coordonnée z à tous les vertex de mes tilemap pour que les vertex ne soient plus affiché dans l'ordre ou je dessine mes tilemap mais bien dans l'ordre avec lequel j'ai insérer mes sprites dans ma liste.
Et pour virer le problème avec la transparence, j'active un alpha_test ainsi, tout les pixels qui sont transparent au bord de mes sprite ne seront pas écris dans le zbuffer et donc ne viendront pas cacher ce qui sera derrière.)

En fait ce que je cherche à faire c'est une combinaison des 2 techniques suivantes. (tilemapping et zBeuffering.)

La technique ou je trie tout dans la liste est plus simple mais plus lente. (D'ailleurs toutes les techniques (ou presque.) qui sont plus simple à mettre en œuvre en informatique sont souvent plus lente à l'exécution.))

Les techniques plus optimisées et plus avancées demandent souvent un peu plus de réflexion et de pratique.

Bref je trouve que se serait bien de pouvoir combiner ces 2 techniques avec la SFML, il y a bien sûr une complication supplémentaire pour les sprites semi-transparent mais il y a les rendertexture pour régler ce genre de problème non ?

« Modifié: Juillet 04, 2013, 02:44:46 pm par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Définir un ordre d'affichage par vertex.
« Réponse #13 le: Juillet 04, 2013, 02:58:07 pm »
Citer
En rajoutant juste ces quelques lignes de code dans mon code ça ne marcherait pas ?
Non, il faut modifier SFML à plusieurs endroits pour faire fonctionner le depth buffer correctement. En plus si tu fais ça dans ton code, ça ne sera pas pris en compte par SFML.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #14 le: Juillet 04, 2013, 03:04:55 pm »
Citer
Non, il faut modifier SFML à plusieurs endroits pour faire fonctionner le depth buffer correctement. En plus si tu fais ça dans ton code, ça ne sera pas pris en compte par SFML.

Erf.  :'(