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 :/