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

Auteur Sujet: Problème de vertex entre carte graphique ATI et NVidia  (Lu 2637 fois)

0 Membres et 1 Invité sur ce sujet

Nikogram

  • Newbie
  • *
  • Messages: 39
    • Voir le profil
    • E-mail
Problème de vertex entre carte graphique ATI et NVidia
« le: Février 10, 2013, 11:30:34 am »
Bonjour à tous.

Actuellement dans mon jeu j'utilise un sf::VertexArray de sf::Quads pour afficher tout l'environnement de mon jeu. Il y a quelques jours j'ai été confronté à un petit souci : créer une ligne oblique en utilisant un sf::Quads. La première solution que j'ai trouvé est de dessiner les lignes dans une image. Problème : ça prend beaucoup de place et j'ai cru comprendre qu'un sf::Texture avait une taille (en pixels) limite en fonction de la carte graphique, et vu que je compte ajouter énormément d'éléments à l'image, j'ai tenté d'utiliser la deuxième solution : créer un sf::Quads de couleur unis qui "entoure" la ligne que je veux dessiner. En gros je crée un quadrilatère assez plat pour faire croire que c'est une ligne.
Cette solution a très bien fonctionné sur mon PC. Cependant en voulant le tester sur un autre PC j'ai remarqué que les lignes ne s'affichaient plus. Après avoir testé le programme sur 4 PC différents, j'en ai conclut que la gestion des vertex était légèrement différente sur une ATI et une NVidia.

Voici le code utilisé pour initialiser une des ligne que je dois afficher, qui fonctionne sur une NVidia :
sf::Vertex coinsLigneAffichee[3];
coinsLigneAffichee[0].position = sf::Vector2f(m_coordonneesPixels.x + 1, m_coordonneesPixels.y + 10);
coinsLigneAffichee[1].position = sf::Vector2f(m_coordonneesPixels.x + 25, m_coordonneesPixels.y - 2);
coinsLigneAffichee[2].position = sf::Vector2f(m_coordonneesPixels.x + 1, m_coordonneesPixels.y + 9);
coinsLigneAffichee[3].position = sf::Vector2f(m_coordonneesPixels.x + 25, m_coordonneesPixels.y - 3);
coinsLigneAffichee[0].texCoords = sf::Vector2f(2 + 40 * (m_identifiant - 1), 34);
coinsLigneAffichee[1].texCoords = sf::Vector2f(2 + 40 * (m_identifiant - 1), 34 + 1);
coinsLigneAffichee[2].texCoords = sf::Vector2f(2 + 40 * (m_identifiant - 1) + 1, 34 + 1);
coinsLigneAffichee[3].texCoords = sf::Vector2f(2 + 40 * (m_identifiant - 1) + 1, 34);
 
Voici maintenant le code fonctionnant sur une ATI, ayant le même résultat :
sf::Vertex coinsLigneAffichee[3];
coinsLigneAffichee[0].position = sf::Vector2f(m_coordonneesPixels.x - 5, m_coordonneesPixels.y + 13);
coinsLigneAffichee[1].position = sf::Vector2f(m_coordonneesPixels.x + 19, m_coordonneesPixels.y + 1);
coinsLigneAffichee[2].position = sf::Vector2f(m_coordonneesPixels.x - 5, m_coordonneesPixels.y + 12);
coinsLigneAffichee[3].position = sf::Vector2f(m_coordonneesPixels.x + 19, m_coordonneesPixels.y);
coinsLigneAffichee[0].texCoords = sf::Vector2f(2 + 40 * (m_identifiant - 1), 34);
coinsLigneAffichee[1].texCoords = sf::Vector2f(2 + 40 * (m_identifiant - 1), 34);
coinsLigneAffichee[2].texCoords = sf::Vector2f(2 + 40 * (m_identifiant - 1), 34);
coinsLigneAffichee[3].texCoords = sf::Vector2f(2 + 40 * (m_identifiant - 1), 34);

Pourriez-vous m'indiquer comment résoudre ce petit problème gênant ?
Merci d'avance.

PS : les drivers sont à jour sur les quatre PC, c'est le seul problème que je rencontre avec des vertex (donc le problème ne vient pas de m_coordonneesPixels et m_identifiant), et je suis obligé d'utiliser un sf::Quads pour afficher une ligne car je dois tout afficher dans un même sf::VertexArray.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de vertex entre carte graphique ATI et NVidia
« Réponse #1 le: Février 10, 2013, 01:34:54 pm »
Il peut en effet y avoir des différences entre cartes graphiques lorsque tu dessines des choses de 1 pixel d'épaisseur. Essaye d'ajouter 0.5 à toutes tes coordonnées, juste pour voir.

Sinon, pourquoi t'imposes-tu d'utiliser un unique vertex array pour tout afficher ?
Laurent Gomila - SFML developer

Nikogram

  • Newbie
  • *
  • Messages: 39
    • Voir le profil
    • E-mail
Re : Problème de vertex entre carte graphique ATI et NVidia
« Réponse #2 le: Février 16, 2013, 02:51:28 pm »
J'ai essayé d'ajouter 0.5 pixels partout, mais mon trait se retrouve déformé ou un peu décalé, et il y a toujours 5-6 pixels de décalage.

Sinon je dois tout afficher dans un unique vertex array pour éviter les "bugs d'affichage".
Pour mon cas, j'ai un monde isométrique composé de blocs. Les blocs en dessous sont cachés par les blocs du dessus. Mais les traits de délimitation de blocs (ce que je cherche à faire) doivent être affiché en même temps que le blocs, pour que les blocs du dessus les cache aussi.
Si j'utilise un vertex array pour les blocs et un autre pour les lignes, le monde sera affiché, puis toutes les lignes de délimitation le seront par dessus, dont les lignes des blocs cachés.

Nikogram

  • Newbie
  • *
  • Messages: 39
    • Voir le profil
    • E-mail
Re : Problème de vertex entre carte graphique ATI et NVidia
« Réponse #3 le: Février 28, 2013, 04:07:47 pm »
Personne n'a de solution, ou n'a eu un problème du même type ?

Autrement j'ai bien une solution : détecter la marque de la carte graphique.
Mais dans ce cas savez-vous comment récupérer la marque de la carte graphique ?
Si jamais cet dernière solution n'est pas faisable, il faudra que l'utilisateur l'indique manuellement (ce qui n'est pas super pratique).
Merci d'avance.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de vertex entre carte graphique ATI et NVidia
« Réponse #4 le: Février 28, 2013, 04:10:30 pm »
glGetString(GL_VENDOR), avec OpenGL, mais le résultat n'est pas forcément standard (ça peut être n'importe quoi contenant le fabricant du chipset). Et puis c'est vraiment hasardeux, tu n'es pas certain que toutes les cartes du même constructeur réagissent de la même manière ; ça peut être une histoire de driver, d'OS, de version, ...

Il y a sûrement une solution plus propre, mais je n'ai pas le temps de t'aider en ce moment, désolé :-\
Laurent Gomila - SFML developer

Nikogram

  • Newbie
  • *
  • Messages: 39
    • Voir le profil
    • E-mail
Re : Problème de vertex entre carte graphique ATI et NVidia
« Réponse #5 le: Février 28, 2013, 06:39:55 pm »
Je vais voir ça de plus près. Merci pour ton aide ;)

 

anything