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

Auteur Sujet: Artefact Antialiasing rotation d'un sprite avec un setTextureRect  (Lu 4073 fois)

0 Membres et 1 Invité sur ce sujet

Thall206

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Bonjour,

en programmant tranquillement, je me suis aperçu que certains de mes sprites dont leur texture sont tirés d'un fichier commun, et défini à l'aide d'un ".setTextureRect" avaient des "artefacts", des glitchs trainant sur le bord, et faisant apparaître des pixels situés en dehors du rectangle de texture. En faisant des tests, je suis tombé sur la conclusion que l'antialiasing créait ces petits pixels de trop lorsque le sprite subit une rotation (logique, faut bien avoir une diagonale pour avoir l'antialiasing opérant):



#include <SFML/Graphics.hpp>

#include <iostream>


int main()
{
    sf::Sprite sprite;

    sf::Texture texture;
    texture.loadFromFile("test.png");


    sprite.setTexture(texture);
    sprite.setTextureRect(sf::IntRect(21,21,21,21));


    sprite.setScale(15,15);
    sprite.setPosition(300,120);


    sf::ContextSettings settings;
    settings.antialiasingLevel = 8;

    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML works!", sf::Style::Default, settings);


    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
            sprite.setRotation(sprite.getRotation() + 0.1);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
            sprite.setRotation(sprite.getRotation() - 0.1);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
            sprite.setRotation(0);

        window.clear();
        window.draw(sprite);
        window.display();
    }

    return 0;
}
 



J'ai mis le code source ainsi que la texture utiliser pour les tests.
On peut voir que normalement, en position setRotation(0), la fenêtre est bien noire, mais quand on effectue une rotation sur le sprite, on voit apparaître des bords de pixel possédants la couleur des carrés adjacents au rectangle de texture défini.

Ma question finale est: Est-ce que j'ai mal fait quelque chose? Est-ce un bug connu ? (une fonctionnalité désirée comme j'ai pu lire pour d'autres sujets à propos de glitchs visuels)

Cordialement,
Merci de m'avoir lu, bonne journée !

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Artefact Antialiasing rotation d'un sprite avec un setTextureRect
« Réponse #1 le: Novembre 13, 2018, 07:26:02 pm »
Essaye avec texture.setSmooth(false). Par défaut les textures utilisent de l'interpolation bilinéaire, donc lorsque pixels et texels ne correspondent pas à 100%, tu as les texels adjacents qui bavent.
Laurent Gomila - SFML developer

Thall206

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re: Artefact Antialiasing rotation d'un sprite avec un setTextureRect
« Réponse #2 le: Novembre 14, 2018, 04:55:11 pm »
Malheureusement cela ne change rien :/
Si je prends la texture découpé et que je la colle sur une texture vierge cela ne résout-il pas le soucis? Mais ça causerait un problème de performance non?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Artefact Antialiasing rotation d'un sprite avec un setTextureRect
« Réponse #3 le: Novembre 14, 2018, 08:27:41 pm »
Etrange.

Oui ça masquerait le problème (il me semble que SFML est paramétré pour que les pixels au-delà des bords de la texture soient dupliqués), mais ce n'est pas vraiment une solution ;)
Laurent Gomila - SFML developer

Thall206

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re: Artefact Antialiasing rotation d'un sprite avec un setTextureRect
« Réponse #4 le: Novembre 14, 2018, 08:35:25 pm »
Je ne sais pas si je peux fournir d'autres informations pour trouver l'origine du problème, hésite pas à me dire si je dois te fournir d'autres paramètres,

j'ai utilisé SFML 5.1 lié en version statique

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Artefact Antialiasing rotation d'un sprite avec un setTextureRect
« Réponse #5 le: Novembre 15, 2018, 07:51:28 am »
Est-ce que sans antialiasing le problème disparaît ?
Laurent Gomila - SFML developer

Thall206

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re: Artefact Antialiasing rotation d'un sprite avec un setTextureRect
« Réponse #6 le: Novembre 15, 2018, 05:41:23 pm »
Oui, le problème disparaît quand l'antialiasing n'est pas mis.

Après un autre test, je découvre que le setSmooth(true) a plus ou moins le même soucis

Le code utilisé:
(click to show/hide)





Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Artefact Antialiasing rotation d'un sprite avec un setTextureRect
« Réponse #7 le: Novembre 15, 2018, 06:36:13 pm »
Oui, ça par contre c'est normal, c omme je te l'ai expliqué.
Laurent Gomila - SFML developer

Thall206

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re: Artefact Antialiasing rotation d'un sprite avec un setTextureRect
« Réponse #8 le: Novembre 15, 2018, 11:06:50 pm »
Pardon, au temps pour moi j'avais mal compris