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

Auteur Sujet: Pixel clamping, problème de clignotement  (Lu 1286 fois)

0 Membres et 1 Invité sur ce sujet

PetitPoney

  • Newbie
  • *
  • Messages: 44
    • Voir le profil
Pixel clamping, problème de clignotement
« le: Octobre 18, 2013, 12:39:00 am »
Bonjour !  :)

Je cherche un moyen de régler un problème de "pixel clamping". En effet, lorsqu'un objet devient plus petit qu'un pixel, il se met à clignoter lors de déplacement, ce qui est tout à fait normal. Je cherche donc un moyen d'eviter ce problème en camplant la taille de mes objets à un pixel.

Un petit bout de code :

       

    #include <SFML/Window.hpp>
    #include <SFML/Graphics.hpp>
     
    int main(void)
    {
      sf::RenderWindow window(sf::VideoMode(1000, 500), "test");
      sf::View view;
      view.setCenter(500, 250);
      view.setSize(4000, 2000);
     
      sf::RectangleShape rect;
      rect.setPosition(499, 0);
      rect.setSize(sf::Vector2f(2.0, 1000.0));
     
      while (window.isOpen())
        {
          sf::Event event;
          while (window.pollEvent(event))
            {
              if (event.type == sf::Event::Closed)
                window.close();
              else if (event.type == sf::Event::MouseWheelMoved)
                {
                  if (event.mouseWheel.delta > 0)
                    view.setSize(view.getSize().x + 20,
                                 view.getSize().y + 20);
                  else
                    view.setSize(view.getSize().x - 20,
                                 view.getSize().y - 20);
                }
     
              if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
                view.move(-0.5, 0);
              else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                view.move(0.5, 0);
              window.setView(view);
            }
          window.clear();
          window.draw(rect);
          window.display();
        }
      return 0;
    }

 

Lors du lancement il n'y aura rien d'affiché. Utilisez les flèche de direction droite/gauche pour voir l'effet de clignotement.

Plusieurs pistes :
  • Augmenter la taille de l'objet jusqu'à obtenir : object.getGlobalBounds.width == screenPixelSize.x
    Dans ce cas, comment calcul-t-on la correspondance entre un pixel physique et un pixel en coordonnée sfml ? (viewSize.x / windowResolution.x   ??)
  • Faire du supersampling, mais au final ça ne fait que repousser le problème, et c'est plus gourmand en calcul

Cordialement

EDIT :
La première solution consisterait à ajouter dans la boucle quelque chose du genre :

while (rect.getGlobalBounds().width / view.getSize().x < 0.00078125)
   rect.scale(1.00001, 1.0);
// 0.00078125 = rect.getGlobalBounds().width / view.getSize().x   pour lequel il n'y a pas de clignotement (largeur du rectangle == 1 pixel physique)
 
Mais c'est vraiment moche :/
« Modifié: Octobre 18, 2013, 12:57:52 am par PetitPoney »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Pixel clamping, problème de clignotement
« Réponse #1 le: Octobre 18, 2013, 08:04:11 am »
Citer
Dans ce cas, comment calcul-t-on la correspondance entre un pixel physique et un pixel en coordonnée sfml ? (viewSize.x / windowResolution.x   ??)
Par exemple, oui. Pour être tout à fait exact il faudrait prendre en compte le viewport, mais si tu ne l'utilises pas tu peux l'ignorer.
Laurent Gomila - SFML developer