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

Auteur Sujet: Précisions concernant le fonctionnement de sf::Vertex  (Lu 2436 fois)

0 Membres et 1 Invité sur ce sujet

Starfighter

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Précisions concernant le fonctionnement de sf::Vertex
« le: Juillet 06, 2012, 01:32:13 am »
Bonsoir,

Je suis en train de faire quelques essais avec la classe Vertex pour tracer des lignes et je suis confronté à un petit souci dont je ne trouve pas la cause : j'ai un problème de décallage sur Y (de 1 pixel trop haut) uniquement quand je tente de dessiner des lignes horizontales.

exemples :

Vertex vertices[] =
    {
    Vertex (Vector2f(0,0),Color (255,255,255)),
    Vertex (Vector2f(10,0),Color (255,255,255))
    };
    app.draw(vertices,2,Lines);
 

Si j'utilise le code ci-dessus la ligne n'apparaît pas à l'écran.

Pour l'obtenir sur la première ligne je dois utiliser les coordonnées (0,1) et (10,1)... ce qui devrait normalement la faire apparaître sur la 2nd ligne horizontale.

Ce problème ne se produit pas sur l'axe vertical : si j'utilise les coordonnées (0,0) et (0,10) la ligne verticale apparaît parfaitement aux bonnes coordonnées.

De même en utilisant une diagonale (0,0) et (10,10) le résultat est correct.
et si je pousse un peu plus l'expérience en utilisant (1,1) et (10,10), là aussi c'est parfait : le point (0,0) n'est pas dessiné.

Il y a quelque chose que je n'ai pas dû comprendre, je n'ai donc rien contre un petit éclaircissement.

Merci d'avance.

PS: J'ai noté que dans tous les cas le dernier point n'était jamais dessiné, mais ça je pense que ça doit être normal (il doit être considéré comme exclu ?)


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Précisions concernant le fonctionnement de sf::Vertex
« Réponse #1 le: Juillet 06, 2012, 08:25:35 am »
La clé c'est de comprendre que la coordonnée de ta ligne représente son milieu. Si tu veux que ta ligne, qui fait 1 pixel d'épaisseur, s'étale sur le premier pixel, il faut donc que sa coordonnée soit 0.5 ; de cette façon la ligne ira bien du "début du pixel (0) à sa "fin" (1). Alors que si tu utilises 0, ta ligne se retrouvera entre -0.5 et 0.5, et avec les règles d'arrondi et de rastérisation d'OpenGL elle finit sur le pixel -1 au lieu de 0.

Pour résumer, puisque ta ligne va s'étendre de 0.5 pixels dans toutes les directions, pour obtenir un résultat exact il faut placer les points au centre des pixels, donc avec des coordonnées en 1/2.
Laurent Gomila - SFML developer

Starfighter

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Re : Précisions concernant le fonctionnement de sf::Vertex
« Réponse #2 le: Juillet 06, 2012, 11:11:51 am »
Merci beaucoup pour cette réponse très claire.

La "notion clé" me fait réaliser la nécessité des me pencher sur le fonctionnement d'OpenGL pour éviter de multiplier ce style de problèmes car ce n'est pas spontannément un concept qui m'est familier... donc à bosser. ;)

Merci encore et bonne journée.




 

anything