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

Auteur Sujet: RenderTexture décalage de pixels  (Lu 1389 fois)

0 Membres et 1 Invité sur ce sujet

St4n0f

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
RenderTexture décalage de pixels
« le: Septembre 17, 2015, 08:50:04 pm »
Bonsoir.
Je développe en ce moment un éditeur de niveau en utilisant Qt et SFML. Je me suis aperçu d'un soucis avec la SFML après avoir recompilé plusieurs fois la lib testé sur une autre machine et avoir vérifié mes drivers. Il semblerait avoir un soucis avec sf::RenderTexture. Je veux juste afficher une grille définit par: une largeur, une hauteur, la largeur d'une cellule, la hauteur d'une cellule. Mais RenderTexture ne souhaite pas faire ce que j'attends. Une image pour illustrer.


Grille: 320 x 320 (pixels)
Tiles: 32 x 32 (pixels)
Vert: La grille dessiné sur un renderTexture (Position: 0.f, 0.f);
Rouge: La grille dessiné via la fenêtre; (Afficher après sf::RenderTexture en traçant la grille depuis la position 0.f, 0.f).

Voilà un code fait à l'instant pour résumer le problème.
#include <iostream>
#include <SFML/Graphics.hpp>

int main()
{
        int grid_width = 320;
        int grid_height = 320;
        int tiles_width = 32;
        int tiles_height = 32;

    // Create GRID
    sf::RenderTexture gridRenderTexture;
    gridRenderTexture.create(grid_width, grid_height);
    gridRenderTexture.clear(sf::Color::Black);

    // Vertical
        for(int x=0; x<=grid_width/tiles_width; ++x)
        {
                sf::VertexArray line(sf::Lines, 2);
                line[0].position = sf::Vector2f(x*tiles_width, 0.f);
                line[0].color = sf::Color::Green;
                line[1].position = sf::Vector2f(x*tiles_width, grid_height);
                line[1].color = sf::Color::Green;
                gridRenderTexture.draw(line);
        }

        // Horizontal
        for(int y=0; y<=grid_height/tiles_height; ++y)
        {
                sf::VertexArray line(sf::Lines, 2);
                line[0].position = sf::Vector2f(0.f, y*tiles_height);
                line[0].color = sf::Color::Green;
                line[1].position = sf::Vector2f(grid_width, y*tiles_height);
                line[1].color = sf::Color::Green;

                gridRenderTexture.draw(line);
        }
        gridRenderTexture.display();

        sf::Texture tx(gridRenderTexture.getTexture());
        sf::Sprite grid;
        grid.setTexture(tx);

        // Create Window
        sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
    while(window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear(sf::Color::Blue);
        window.draw(grid);

                // Vertical
                for(int x=0; x<=grid_width/tiles_width; ++x)
                {
                        sf::VertexArray line(sf::Lines, 2);
                        line[0].position = sf::Vector2f(x*tiles_width, 0.f);
                        line[0].color = sf::Color::Red;
                        line[1].position = sf::Vector2f(x*tiles_width, grid_height);
                        line[1].color = sf::Color::Red;
                        window.draw(line);
                }

                // Horizontal
                for(int y=0; y<=grid_height/tiles_height; ++y)
                {
                        sf::VertexArray line(sf::Lines, 2);
                        line[0].position = sf::Vector2f(0.f, y*tiles_height);
                        line[0].color = sf::Color::Red;
                        line[1].position = sf::Vector2f(grid_width, y*tiles_height);
                        line[1].color = sf::Color::Red;

                        window.draw(line);
                }

        window.display();
    }

    return EXIT_SUCCESS;
}
 

Le problème se produit en aussi en variant la taille de la grille et des cellules.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : RenderTexture décalage de pixels
« Réponse #1 le: Septembre 17, 2015, 09:00:50 pm »
Le problème c'est que tu es pile à cheval entre deux lignes/colonnes de pixels à chaque fois. Donc OpenGL peut très bien décider de dessiner les pixels précédents ou suivants. Si tu veux un rendu plus robuste, trace tes lignes avec des demi-coordonnées (x.5, y.5).
Laurent Gomila - SFML developer

St4n0f

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re : RenderTexture décalage de pixels
« Réponse #2 le: Septembre 17, 2015, 09:18:33 pm »
Merci pour cette réponse rapide Laurent.

Effectivement la solution semble fonctionné. J'avais déjà testé cette solution mais la trouvant un peu "bidouilleuse". Mais effectivement en y pensant bien, ça semble être la réponse adéquate.

Bien ! C'est une épine du pied que tu m'enlèves là. Encore merci, problème résolu.