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

Auteur Sujet: sf::RenderTexture et Opengl ?  (Lu 3569 fois)

0 Membres et 1 Invité sur ce sujet

Ditret

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • E-mail
sf::RenderTexture et Opengl ?
« le: Septembre 05, 2012, 07:39:37 pm »
Bonjour,

Je cherche depuis quelques temps a essayé différents "trucs" en opengl et sfml.
Et je me demandé si on peut dessiner en OpenGL dans un sf::RenderTexture ?

j'ai essayé 2/3 manipulations a partir de l'exemple fourni mais j'ai l'impression que seul sf::RenderWindow peut faire un rendu OpenGL ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : sf::RenderTexture et Opengl ?
« Réponse #1 le: Septembre 05, 2012, 08:36:49 pm »
Les deux classes fonctionnent exactement de la même manière, c'est le même code qui tourne derrière (cf. la classe de base sf::RenderTarget).

Si tu as un souci n'hésite pas à poster un code minimal qui reproduit le problème, et on l'examinera.
Laurent Gomila - SFML developer

Ditret

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • E-mail
Re : sf::RenderTexture et Opengl ?
« Réponse #2 le: Septembre 05, 2012, 10:17:19 pm »
pour les tests, j'ai prix l'exemple du cube en bois openGL fourni dans les exemples SFML.

Le problème c'est que des que je creer un sf::RenderTexture, mon cube ne s'affiche plus, je sais pas comment lui dire de dessiner sur ce sf::RenderTexture ou un autre ... ?

si j'appel pas sf::RenderTexture::create(...) , le cube s'affiche normalement.

#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>

int main()
{
    // Create the main window
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML OpenGL");
    window.setVerticalSyncEnabled(true);

    sf::RenderTexture render;
    if (!render.create(800, 600))
        return -1;

    /* texture opengl bois*/
    GLuint texture = 0;
    {
        sf::Image image;
        if (!image.loadFromFile("resources/texture.jpg"))
            return EXIT_FAILURE;
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.getSize().x, image.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsPtr());
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    }

    // Enable Z-buffer read and write
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glClearDepth(1.f);

    // Setup a perspective projection
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.f, 1.f, 1.f, 500.f);

    // Bind our texture
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);
    glColor4f(1.f, 1.f, 1.f, 1.f);


    // boucle principale
    while (window.isOpen())
    {
        // Process events
        sf::Event event;
        while (window.pollEvent(event))
        {
            // Close window : exit
            if (event.type == sf::Event::Closed)
                window.close();
        }

        // Clear the depth buffer
        glClear(GL_DEPTH_BUFFER_BIT);

        // Apply some transformations
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        // Draw a cube
        float size = 20.f;
        /* position du cube */
        glTranslated(0,0,-size*4);
        glRotated(45,1,1,0);
        /* desin du cube */
        glBegin(GL_QUADS);

            glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(0, 1); glVertex3f(-size,  size, -size);
            glTexCoord2f(1, 1); glVertex3f( size,  size, -size);
            glTexCoord2f(1, 0); glVertex3f( size, -size, -size);

            glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
            glTexCoord2f(0, 1); glVertex3f(-size,  size, size);
            glTexCoord2f(1, 1); glVertex3f( size,  size, size);
            glTexCoord2f(1, 0); glVertex3f( size, -size, size);

            glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(0, 1); glVertex3f(-size,  size, -size);
            glTexCoord2f(1, 1); glVertex3f(-size,  size,  size);
            glTexCoord2f(1, 0); glVertex3f(-size, -size,  size);

            glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
            glTexCoord2f(0, 1); glVertex3f(size,  size, -size);
            glTexCoord2f(1, 1); glVertex3f(size,  size,  size);
            glTexCoord2f(1, 0); glVertex3f(size, -size,  size);

            glTexCoord2f(0, 1); glVertex3f(-size, -size,  size);
            glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
            glTexCoord2f(1, 1); glVertex3f( size, -size,  size);

            glTexCoord2f(0, 1); glVertex3f(-size, size,  size);
            glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
            glTexCoord2f(1, 0); glVertex3f( size, size, -size);
            glTexCoord2f(1, 1); glVertex3f( size, size,  size);

        glEnd();

        // Finally, display the rendered frame on screen
        render.display();
        window.draw( sf::Sprite(render.getTexture()) );
        window.display();
    }

    // Don't forget to destroy our texture
    glDeleteTextures(1, &texture);

    return EXIT_SUCCESS;
}

 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : sf::RenderTexture et Opengl ?
« Réponse #3 le: Septembre 05, 2012, 10:23:52 pm »
Avant de dessiner sur la render texture, il faut appeler render.setActive(true). Pour la fenêtre pas besoin, puisque tu n'utilises que des fonctions SFML (qui le font automatiquement).
Laurent Gomila - SFML developer

Ditret

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • E-mail
Re : sf::RenderTexture et Opengl ?
« Réponse #4 le: Septembre 05, 2012, 10:43:18 pm »
ca marche pas mieux ><, je ne sais pas trop ou les placer les setActive(true) ?

         ...
        /* desin du cube */
        render.setActive(true);
        glBegin(GL_QUADS);

            glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(0, 1); glVertex3f(-size,  size, -size);
            glTexCoord2f(1, 1); glVertex3f( size,  size, -size);
            glTexCoord2f(1, 0); glVertex3f( size, -size, -size);

            glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
            glTexCoord2f(0, 1); glVertex3f(-size,  size, size);
            glTexCoord2f(1, 1); glVertex3f( size,  size, size);
            glTexCoord2f(1, 0); glVertex3f( size, -size, size);

            glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(0, 1); glVertex3f(-size,  size, -size);
            glTexCoord2f(1, 1); glVertex3f(-size,  size,  size);
            glTexCoord2f(1, 0); glVertex3f(-size, -size,  size);

            glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
            glTexCoord2f(0, 1); glVertex3f(size,  size, -size);
            glTexCoord2f(1, 1); glVertex3f(size,  size,  size);
            glTexCoord2f(1, 0); glVertex3f(size, -size,  size);

            glTexCoord2f(0, 1); glVertex3f(-size, -size,  size);
            glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
            glTexCoord2f(1, 1); glVertex3f( size, -size,  size);

            glTexCoord2f(0, 1); glVertex3f(-size, size,  size);
            glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
            glTexCoord2f(1, 0); glVertex3f( size, size, -size);
            glTexCoord2f(1, 1); glVertex3f( size, size,  size);

        glEnd();
        render.setActive(false);


        // Finally, display the rendered frame on screen
        render.display();
        window.draw( sf::Sprite(render.getTexture()) );
        window.display();
 


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : sf::RenderTexture et Opengl ?
« Réponse #5 le: Septembre 05, 2012, 11:37:52 pm »
Citer
je ne sais pas trop ou les placer les setActive(true) ?
Avant chaque (groupe d') appel OpenGL qui concerne la render texture. Donc avant de faire tes initialisations aussi.
Laurent Gomila - SFML developer

Ditret

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • E-mail
Re : sf::RenderTexture et Opengl ?
« Réponse #6 le: Septembre 06, 2012, 12:07:55 am »
j'ai maintenant compris comment fonctionner le setActive() ( après quelques tests ^^ ), par contre ca n'affiche rien quand j'utilise le sf::RenderTexture.
je pense que le probléme vient de la fin du code ici :
window.draw( sf::Sprite(render.getTexture()) );
enfin je crois ... sinon je voie pas ou ?

le code actuel :
#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>

/* desin du cube */
void cube()
{
        float size = 20.f;
        glBegin(GL_QUADS);
            glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(0, 1); glVertex3f(-size,  size, -size);
            glTexCoord2f(1, 1); glVertex3f( size,  size, -size);
            glTexCoord2f(1, 0); glVertex3f( size, -size, -size);

            glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
            glTexCoord2f(0, 1); glVertex3f(-size,  size, size);
            glTexCoord2f(1, 1); glVertex3f( size,  size, size);
            glTexCoord2f(1, 0); glVertex3f( size, -size, size);

            glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(0, 1); glVertex3f(-size,  size, -size);
            glTexCoord2f(1, 1); glVertex3f(-size,  size,  size);
            glTexCoord2f(1, 0); glVertex3f(-size, -size,  size);

            glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
            glTexCoord2f(0, 1); glVertex3f(size,  size, -size);
            glTexCoord2f(1, 1); glVertex3f(size,  size,  size);
            glTexCoord2f(1, 0); glVertex3f(size, -size,  size);

            glTexCoord2f(0, 1); glVertex3f(-size, -size,  size);
            glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
            glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
            glTexCoord2f(1, 1); glVertex3f( size, -size,  size);

            glTexCoord2f(0, 1); glVertex3f(-size, size,  size);
            glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
            glTexCoord2f(1, 0); glVertex3f( size, size, -size);
            glTexCoord2f(1, 1); glVertex3f( size, size,  size);
        glEnd();
}

/* chargement texture */
GLuint chargerTexture( const std::string &lien )
{
        GLuint texture = 0;
        sf::Image image;
        if (!image.loadFromFile( lien  ))
            return EXIT_FAILURE;
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.getSize().x, image.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsPtr());
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

        return texture;
}

///////////////////////////////////////////////////////////////////////////////////////
int main()
{
    GLuint texture = 0;
    // Create the main window
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML OpenGL");

    sf::RenderTexture render;
    if (!render.create(800, 600))
        return -1;

    /* dessin sur le render */
    render.setActive(true);
    {
        // Enable Z-buffer read and write
        glEnable(GL_DEPTH_TEST);
        glDepthMask(GL_TRUE);
        glClearDepth(1.f);

        // Setup a perspective projection
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(90.f, 1.f, 1.f, 500.f);

        // charger texture
        texture = chargerTexture("resources/texture.jpg");
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, texture);
        glColor4f(1.f, 1.f, 1.f, 1.f);
    }

    // boucle principale
    while (window.isOpen())
    {
        // Process events
        sf::Event event;
        while (window.pollEvent(event))
        {
            // Close window : exit
            if (event.type == sf::Event::Closed)
                window.close();
        }

        /* dessin sur le render */
        render.setActive(true);
        {
            // Clear the depth buffer
            glClear(GL_DEPTH_BUFFER_BIT);

            // Apply some transformations
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();

            /* position du cube */
            glTranslated(0,0,-60);
            glRotated(45,1,1,0);

            /* dessin du cube */
            cube();
        }

        // rendu
        render.display();
        window.draw( sf::Sprite(render.getTexture()) );
        window.display();
    }

    // Don't forget to destroy our texture
    glDeleteTextures(1, &texture);

    return EXIT_SUCCESS;
}
 

Ditret

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • E-mail
Re : sf::RenderTexture et Opengl ?
« Réponse #7 le: Septembre 08, 2012, 02:36:30 pm »
suite du post de dessus.

je n'ais toujours pas réussi a afficher le cube dans le sf::RenderTexture, par contre si je le change par un sf::RenderWindow j’obtiens bien le cube sur une deuxième fenêtre.

Pour le sf::RenderTexture, il ne dessine pas le cube sur la fenêtre principale. je pense avoir oublier de déclarer ou configurer quelques choses ?.
 
window.draw( sf::Sprite( render.getTexture() );

une personne a une idée ?
« Modifié: Septembre 08, 2012, 02:39:06 pm par Ditret »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : sf::RenderTexture et Opengl ?
« Réponse #8 le: Septembre 08, 2012, 07:33:18 pm »
Désolé, j'ai pas trop le temps de faire des tests en ce moment :-\

Mais en tout cas je n'ai pas trouvé d'erreur qui saute aux yeux dans ton code.
Laurent Gomila - SFML developer

Ditret

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • E-mail
Re : sf::RenderTexture et Opengl ?
« Réponse #9 le: Septembre 09, 2012, 12:45:44 pm »
y a pas de problème Laurent.
Je vais continuer a chercher un peu ( et regarder les sources de la SFML au passage pour essayer d'un peu mieux comprendre comment ca marche ).