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

Auteur Sujet: Effet de bord sur texture atlas.  (Lu 6831 fois)

0 Membres et 3 Invités sur ce sujet

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Effet de bord sur texture atlas.
« le: Mai 11, 2013, 01:29:03 pm »
J'ai un soucis lors de l'affichage de mes couches tilemap uniquement quand j'utilise une texture atlas ( commune à tout les tiles ) généré via cette méthode :

void tileManager::generateAtlasTexture(sf::Int32 edgeSize)
{

        int x  = 0;
        int y  = 0;
        int nl = int(((sqrt( mTileArray.size() )*.5f)*2))+1;
        sf::Int32 atlasSquare = nl * edgeSize;
        mAtlasTexture.create(atlasSquare,atlasSquare);

        std::vector<tile*>::iterator it;
       
        for(it=mTileArray.begin(); it<mTileArray.end(); ++it)
        {
                // retrieve tile
                tile * t = *it;
                // get pixel
            const sf::Uint8 * pixels = t->getTexture().copyToImage().getPixelsPtr();
                // update them into atlas texture
                mAtlasTexture.update (pixels,edgeSize,edgeSize,x,y);
                               

                t->mAtlasCoordinate.left        = x;
                t->mAtlasCoordinate.top         = y;
                t->mAtlasCoordinate.width       = edgeSize;
                t->mAtlasCoordinate.height      = edgeSize;
                               
                t->mSprite.setTexture(mAtlasTexture);
                t->mSprite.setTextureRect(t->mAtlasCoordinate);
               
                x += edgeSize;
                if (x>=atlasSquare)
                {
                        x = 0;
                        y+=edgeSize;
                }
        }
       
        // control
        //mAtlasTexture.copyToImage().saveToFile("ctrl.png");
}

mAtlasCoordinate est un sf::IntRect , l'effet obtenu est le suivant :



je voudrais obtenir :



pour le résultat qui fonctionne , je découpe chaque tuile dans une image que je copie et que j'ajoute dans un sf::Texture , chaque tuile a donc un sf::Texture & sf::Image propre , mais en vue d'optimisé le tout
je dois passé par une texture atlas pour faire ensuite l'optimisation avec un vertex array.

j'ai fait le tour de la question , setSmooth() n'est pas activé , ce n'est pas un problème de positionnement des tuilles puisque sinon cela apparaîtrait avec la méthode de base , une texture & une image par tile.
je pense plus à un soucis d'uv au niveau sfml , clamp de texture ?
merci de m'apporté un oeil neuf sur ce problème.


Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Effet de bord sur texture atlas.
« Réponse #1 le: Mai 11, 2013, 05:13:27 pm »
j'ai résolu le problème en passant de
mSprite.setPosition(sf::Vector2f(position.x, position.y));
a
mSprite.setPosition((int)position.x, (int)position.y);


Edit :

Quand je change la vue , le problème reviens...
« Modifié: Mai 11, 2013, 05:23:26 pm par Cpl.Bator »

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Messages: 4321
    • Voir le profil
    • E-mail
Re : Effet de bord sur texture atlas.
« Réponse #2 le: Mai 11, 2013, 08:08:40 pm »
Comme tu l'as remarqué, le problème arrive quand une image est affichée à des coordonnées non entière. Le problème peut revenir si ta vue induit un décalage d'un nombre non entier de pixels.
SFML / OS X developer

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Effet de bord sur texture atlas.
« Réponse #3 le: Mai 11, 2013, 11:13:54 pm »
le problème arrive dans les cas suivants :

- Coordonnées flottante & texture commune à tout les sprites ( découpage a l'aide de setTextureRect() )
- Coordonnées entière & changement de vue ( zoom ) & texture commune aussi.
- Coordonnées flottante & changement de vue ( zoom ) & texture commune aussi.

ca marche uniquement si chaque sprite possède sa propre texture & image. ( que je découpe aussi au passage )

le point commun du problème , c'est la texture commune a tout les sprites , j'ai vérifier les sources de la sfml , il "clampe" correctement , je suis bloqué à réfléchir la dessus... :/
je me demande si lui passer les coordonnées de texture (int) que sfml convertit en UV (float) induit un décalage lors des zooms , je vais trafiqué en ce sens...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Effet de bord sur texture atlas.
« Réponse #4 le: Mai 12, 2013, 08:44:26 am »
C'est un problème insoluble, ne vous cassez pas trop la tête dessus. C'est même une "fonctionnalité" : dans certains cas on a besoin que ça bave un peu (pour des sprites en mouvement ou en rotation, ça évite un effet saccadé).
Laurent Gomila - SFML developer

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Effet de bord sur texture atlas.
« Réponse #5 le: Mai 12, 2013, 12:01:10 pm »
c'est bien ce que je me disait. je me tate à essayer le vertexArray pour voir si cela change quelque chose.
je pense que le soucis pourrais être régler si on pouvais passer des floats pour les uv.

setTextureRect( sf::IntRect() ) // coordonnées en pixels
setTextureRect( sf::IntFloat() ) // coordonnées entre 0-1

le problème interne a sfml serais de connaitre la taille de la texture , car l'update interne se base sur ces valeurs (intrect).

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Effet de bord sur texture atlas.
« Réponse #6 le: Mai 12, 2013, 02:14:09 pm »
Citer
je me tate à essayer le vertexArray pour voir si cela change quelque chose.
Ca ne changerait rien, tout est déjà basé sur des vertex arrays.

Citer
je pense que le soucis pourrais être régler si on pouvais passer des floats pour les uv.
OpenGL prend des floats pour les UVs, je dois donc déjà faire cette conversion en interne.
Laurent Gomila - SFML developer

kimci86

  • Full Member
  • ***
  • Messages: 128
    • Voir le profil
Re : Effet de bord sur texture atlas.
« Réponse #7 le: Mai 12, 2013, 02:24:27 pm »
Salut,
Tu pourrais faire le rendu sur une RenderTexture avec des coordonnées entières, puis appliquer les transformations.

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Effet de bord sur texture atlas.
« Réponse #8 le: Mai 12, 2013, 03:11:36 pm »
le rtt résoud le problème , effectivement , mais c'est du bricolage & les perfs en prenne un coup.
je pense que le soucis viens de la SFML , il ne prend pas en compte la taille des texels lors d'un redim de texture.
je fouille de ce coté http://gamedev.stackexchange.com/questions/46963/how-to-avoid-texture-bleeding-in-a-texture-atlas

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
[Résolu] : Effet de bord sur texture atlas.
« Réponse #9 le: Mai 12, 2013, 03:33:06 pm »
Résolu ! 3 jours que je suis dessus ! c'est à cause de l'antialiasing dans le contexte.
merci de m'avoir aidé ;)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Effet de bord sur texture atlas.
« Réponse #10 le: Mai 12, 2013, 06:29:16 pm »
Au fait, ton code est incorrect (comportement indéterminé). Tu prends trop de raccourcis là :

const sf::Uint8 * pixels = t->getTexture().copyToImage().getPixelsPtr();

Tu gardes un pointeur sur les pixels d'une image que tu ne stockes même pas, et qui est du coup détruite dès la fin de l'exécution de cette ligne de code. Sois tu stockes l'image, soit tu ne stockes rien et passes tout le bazar directement à texture.update.
Laurent Gomila - SFML developer

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Effet de bord sur texture atlas.
« Réponse #11 le: Mai 12, 2013, 07:14:07 pm »
l'image est déjà stocké dans t. la copie de pixel part sur ma texture atlas qui possède sa propre image.
quand *pixels est détruit à la fin de la méthode , il ne représentait qu'une copie, pas une référence.
« Modifié: Mai 12, 2013, 07:18:45 pm par Cpl.Bator »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Effet de bord sur texture atlas.
« Réponse #12 le: Mai 12, 2013, 08:00:59 pm »
Non, t stocke un sf::Texture. Les pixels vers lesquels tu pointes sont stockés dans le sf::Image éphémère qui est créé par l'appel copyToImage().
Laurent Gomila - SFML developer

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Effet de bord sur texture atlas.
« Réponse #13 le: Mai 12, 2013, 09:16:09 pm »
oui , mais update fait une copie de l’éphémère ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Effet de bord sur texture atlas.
« Réponse #14 le: Mai 12, 2013, 10:16:33 pm »
Mais il n'existe déjà plus à ce moment. Tu ne l'as pas stocké, il a été détruit dès la fin de la ligne de code sur laquelle il a été créé.
Laurent Gomila - SFML developer