Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: St4n0f le Septembre 17, 2015, 08:50:04 pm

Titre: RenderTexture décalage de pixels
Posté par: St4n0f 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.

(http://i62.tinypic.com/206l8he.png)
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.
Titre: Re : RenderTexture décalage de pixels
Posté par: Laurent 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).
Titre: Re : RenderTexture décalage de pixels
Posté par: St4n0f 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.