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

Auteur Sujet: SFML 2D n'affiche plus rien si des tableaux de vertex sont utilisés  (Lu 2611 fois)

0 Membres et 2 Invités sur ce sujet

Sarcarx

  • Invité
Bonjour à tous !
Je pose cette question en espérant que quelqu’un a déjà eu ce problème, dessiner avec SFML en 2D marche très bien SAUF quand je rajoute des éléments dessinés à l'aide de Vertex array (je n'utilise pas les structures de la SFML pour cela).
Quelqu'un aurait-il une super commande pour ça ?
Je n'ai d'ailleurs même pas besoin de dessiner mes vertex arrays pour ne pas avoir la 2D si je crée un buffer / shader rien ne va plus pour la SFML 2D. Si je commente la création de VBOs (tous les buffer liés à OpenGL) les objets 2D s'affichent très bien, il ne s'agit donc pas des shaders

Voilà le code que j'utilise même en commentant la partie qui dessine les VBOs ça ne marche pas (il faut commenter l'initialisation des buffers pour dessiner la 2D)

        window = new sf::RenderWindow(sf::VideoMode(1024,768),"mdr",sf::Style::Close);

        glewExperimental = GL_TRUE;
        glewInit();

        if(this->window == 0)
        {
                std::cout << "Erreur lors de la creation de la fenetre : " << std::endl;
                return false;
        }

        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LESS);
        glEnable(GL_CULL_FACE);

        rectangle.setSize(sf::Vector2f(500, 50));
        rectangle.setOutlineColor(sf::Color::Red);
        rectangle.setOutlineThickness(5);
        rectangle.setPosition(10, 20);


        font.loadFromFile("./Freshman.ttf");
        text.setFont(font);
        text.setString("");
        text.setCharacterSize(13);
        text.setColor(sf::Color::Black);
        text.setStyle(sf::Text::Bold | sf::Text::Underlined);
        text.setPosition(15, 25);

        glGenVertexArrays(1, &vao);
        glBindVertexArray(vao);

        // Create a Vertex Buffer Object and copy the vertex data to it
        glGenBuffers(1, &position_array_buffer);
        glBindBuffer(GL_ARRAY_BUFFER, position_array_buffer);
        glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);


        // Create an element array
        glGenBuffers(1, &elements_array_buffer);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elements_array_buffer);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size()*sizeof(GLuint), &indices[0], GL_STATIC_DRAW);

        glGenBuffers(1, &normal_array_buffer);
        glBindBuffer(GL_ARRAY_BUFFER, normal_array_buffer);
        glBufferData(GL_ARRAY_BUFFER, this->normals.size() * sizeof(glm::vec3), &this->normals[0], GL_STATIC_DRAW);

        while(1) {
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                glDisableClientState(GL_COLOR_ARRAY);
                glDisableClientState(GL_TEXTURE_COORD_ARRAY);
                window->pushGLStates();
                window->draw(rectangle);
                window->draw(text);
                window->popGLStates();
                window->display();
        }
 


Merci !
« Modifié: Juillet 09, 2014, 11:40:52 am par Sarcarx »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : SFML 2D n'affiche plus rien si des tableaux de vertex sont utilisés
« Réponse #1 le: Juillet 08, 2014, 07:07:40 pm »
SFML via ses fonctions push/popGLStates ne sauvegarde que les états OpenGL 1.1. Tout ce qui est plus récent doit être géré par l'utilisateur lorsqu'il y a changement entre rendu OpenGL <--> rendu SFML.
Laurent Gomila - SFML developer

Sarcarx

  • Invité
Re : SFML 2D n'affiche plus rien si des tableaux de vertex sont utilisés
« Réponse #2 le: Juillet 09, 2014, 09:37:53 am »
SFML via ses fonctions push/popGLStates ne sauvegarde que les états OpenGL 1.1. Tout ce qui est plus récent doit être géré par l'utilisateur lorsqu'il y a changement entre rendu OpenGL <--> rendu SFML.

Et quels outils me permettent de faire ça ? Je vois pas trop ce que je peux utiliser pour 'sauvegarder' le rendu openGL et laisser la SFML faire ce qu'elle veut.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : SFML 2D n'affiche plus rien si des tableaux de vertex sont utilisés
« Réponse #3 le: Juillet 09, 2014, 10:47:14 am »
Le plus simple serait que tu nous montres un code complet minimal qui reproduit le problème, là je pourrai te donner des indications plus précises.
Laurent Gomila - SFML developer

Sarcarx

  • Invité
Re : SFML 2D n'affiche plus rien si des tableaux de vertex sont utilisés
« Réponse #4 le: Juillet 09, 2014, 10:53:33 am »
en gros mon programme principal fait ça :

        Camera* camera = new Camera(Vector3(0,3,0));
        Scene scene("FoulFrey", 1366,768 , camera);
        VertexMobileObject* object = new VertexMobileObject("model/cube.obj"); // la 2D fonctionne si je commente ça
        scene->mainloop();
 

Dans ma Scene je crée un HUD (SFML en 2D)

HUD::HUD() {
        rectangle.setSize(sf::Vector2f(500, 50));
        rectangle.setOutlineColor(sf::Color::Red);
        rectangle.setOutlineThickness(5);
        rectangle.setPosition(10, 20);


        font.loadFromFile("./Freshman.ttf");
        text.setFont(font);
        text.setString("");
        text.setCharacterSize(13);
        text.setColor(sf::Color::Black);
        text.setStyle(sf::Text::Bold | sf::Text::Underlined);
        text.setPosition(15, 25);
}
 

et dans mon vertMobileObject je crée des arrays Opengl, des shaders :
VertexMobileObject::VertexMobileObject(char* path) {
        loadAssImp(path);       // la 2D fonctionne si je commente ça, qui génère les arrays buffer pour OpenGL
        LoadShaders("vertex_light.shader","fragment_light.shader");
}
 

Le code de la mainloop est dans le premier post.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : SFML 2D n'affiche plus rien si des tableaux de vertex sont utilisés
« Réponse #5 le: Juillet 09, 2014, 11:18:50 am »
Citer
code complet minimal
Ca veut dire pas des morceaux de ton projet qui appellent d'autres morceaux qu'on ne voit pas. Ca veut dire un nouveau code qui ne fait que reproduire le problème.
Laurent Gomila - SFML developer

Sarcarx

  • Invité
Re : SFML 2D n'affiche plus rien si des tableaux de vertex sont utilisés
« Réponse #6 le: Juillet 09, 2014, 11:32:53 am »
Citer
code complet minimal
Ca veut dire pas des morceaux de ton projet qui appellent d'autres morceaux qu'on ne voit pas. Ca veut dire un nouveau code qui ne fait que reproduire le problème.
huh ok je vais regrouper tout ça une seconde  :P

Sarcarx

  • Invité
Re : Re : SFML 2D n'affiche plus rien si des tableaux de vertex sont utilisés
« Réponse #7 le: Juillet 09, 2014, 11:39:55 am »
Citer
code complet minimal
Ca veut dire pas des morceaux de ton projet qui appellent d'autres morceaux qu'on ne voit pas. Ca veut dire un nouveau code qui ne fait que reproduire le problème.
voilà j'ai édité mon premier post pour tout mettre dedans.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : SFML 2D n'affiche plus rien si des tableaux de vertex sont utilisés
« Réponse #8 le: Juillet 09, 2014, 11:50:23 am »
Parfait :)

Alors je dirais qu'il faut gérer ceci :

glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 

... avant de dessiner avec SFML. Et à restaurer avant de dessiner avec OpenGL si nécessaire.
Laurent Gomila - SFML developer

Sarcarx

  • Invité
Re : SFML 2D n'affiche plus rien si des tableaux de vertex sont utilisés
« Réponse #9 le: Juillet 09, 2014, 11:56:09 am »
Parfait :)

Alors je dirais qu'il faut gérer ceci :

glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 

... avant de dessiner avec SFML. Et à restaurer avant de dessiner avec OpenGL si nécessaire.

HUH ça a résolu une grande partie du problème, maintenant même après l'initialisation on voit la 2D mais quand je rajoute le dessin de la 3D dans la boucle, ben le problème revient en fait
« Modifié: Juillet 09, 2014, 11:58:09 am par Sarcarx »

Sarcarx

  • Invité
Re : SFML 2D n'affiche plus rien si des tableaux de vertex sont utilisés
« Réponse #10 le: Juillet 09, 2014, 12:01:05 pm »
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


        glUseProgram(this->shaderProgram);
                GLuint TextureID  = glGetUniformLocation(shaderProgram, "myTextureSampler");
                if(!TextureID)
                        cout << "TextureID not found ..." << endl;
                glActiveTexture(GL_TEXTURE0);
                sf::Texture::bind(texture);
                glUniform1i(TextureID, 0);
                GLuint vertexUVID = glGetAttribLocation(shaderProgram, "color");
                if(vertexUVID==-1)
                        cout << "vertexUVID not found ..." << endl;
                glEnableVertexAttribArray(vertexUVID);
                glBindBuffer(GL_ARRAY_BUFFER, color_array_buffer);
                glVertexAttribPointer(vertexUVID, 2, GL_FLOAT, GL_FALSE, 0, 0);  

        GLuint vertexNormal_modelspaceID = glGetAttribLocation(shaderProgram, "normal");
        if(!vertexNormal_modelspaceID)
                cout << "vertexNormal_modelspaceID not found ..." << endl;
        glEnableVertexAttribArray(vertexNormal_modelspaceID);
        glBindBuffer(GL_ARRAY_BUFFER, normal_array_buffer);
        glVertexAttribPointer(vertexNormal_modelspaceID, 3, GL_FLOAT, GL_FALSE, 0, 0 );

        GLint posAttrib;
        posAttrib = glGetAttribLocation(shaderProgram, "position");
        if(!posAttrib)
                cout << "posAttrib not found ..." << endl;

        glEnableVertexAttribArray(posAttrib);
        glBindBuffer(GL_ARRAY_BUFFER, position_array_buffer);
        glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);

        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elements_array_buffer);
        glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);


        sf::Texture::bind(NULL);
        glUseProgramObjectARB(0);

        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        // draws 2D stuff AFTER (above)
        window->pushGLStates();
        drawHud();
        window->popGLStates();
                window->display();


 


Voici le code de la boucle qui n'affiche pas la 2D cette fois ci...

Sarcarx

  • Invité
Re : SFML 2D n'affiche plus rien si des tableaux de vertex sont utilisés
« Réponse #11 le: Juillet 09, 2014, 12:08:57 pm »
ok j'ai réussi, à la fin du dessin de chaque figure en 3D j'ai rajouté cela :

void VertexObject::disableShaders() {

        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

        // glBindBuffer( GL_ARRAY_BUFFER, 0 );
        glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
        glBindTexture( GL_TEXTURE_2D, 0 );
        glDisableVertexAttribArray( 0 );
        glUseProgram( 0 );
        sf::Texture::bind(NULL);
        glUseProgramObjectARB(0);
}
 
Yen a peut etre une partie inutile je vais voir

Merci pour ton aide :D