Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - Totocap

Pages: [1]
1
Graphique / SFML + OpenGL, violation droit d'accès.
« le: Mai 29, 2015, 10:47:12 pm »
Bonsoir,
j'essaye d'utiliser OpenGL en même temps que la SFML, et me heurte à un problème : quand je mixe les dessins OpenGL et le dessin d'un texte SFML, le programme plante et une erreur "violation du droit d'accès" surgit. Après quelques recherches sur internet, j'ai trouvé que la fonction pushGLStates() de la SFML ne réinitialisait pas tous les attributs (ou buffers) d'OpenGL, et que du coup, cela pouvait influer sur les dessins OpenGL ensuite. Le soucis est que je ne vois pas comment régler ce problème.
J'ai réussi à reproduire le problème dans un code à peu près minimal. Je retire également toutes les parties qui ne relèvent pas du sujet comme le chargement des polices d'écriture ou le chargement d'un programme OpenGL (via la classe Locator), qui fonctionnent très bien.

#include <SFML/Graphics.hpp>

#include "Locator.h"

#include <GL/glew.h>
#include <SFML/OpenGL.hpp>
#include <GL/glut.h>

static const GLfloat g_vertex_buffer_data[] = {
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
};

int main(void)
{
    sf::RenderWindow _window(sf::VideoMode(860, 680), "Terrain Generator");

    // Initialise glew.
    glewInit();

    // La police de caractère pour l'affichage des FPS.
    sf::Font _fpsFont;
    // Le texte qui montre les FPS à l'écran.
    sf::Text _fpsCounter;

    // Retiré : chargement de la police et paramètrage du texte pour qu'il affiche "0.00"
    // en haut à gauche de l'écran, en blanc.

    sf::CircleShape circleShape(50.f);
    circleShape.setPosition(sf::Vector2f(100., 100.));

    GLuint VertexArrayID;
    GLuint vertexbuffer;
    glGenVertexArrays(1, &VertexArrayID);
    glBindVertexArray(VertexArrayID);
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);

    // Boucle de jeu
    while (_window.isOpen()) {
        // Evenements
        sf::Event event;
        while (_window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) {
                _window.close();
            }
        }

        // Dessin
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        // ----- OPENGL
        glUseProgram(Locator::getShaderLoader().getProgram(Resources::Shader::Triangle));
        // 1er attribut du buffer : vertices
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0);

        // Dessine le triangle
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glDisableVertexAttribArray(0);

        // ----- SFML
        _window.pushGLStates();

        _window.draw(_fpsCounter);
        _window.draw(circleShape);

        _window.popGLStates();

        _window.display();
    }

    return 0;
}

Quelques captures d'écran que j'obtiens :
- L'erreur en elle-même (et le programme plante sur la ligne "glDrawArrays(GL_TRIANGLES, 0, 3);")
(click to show/hide)
- Ce que j'obtiens si jamais je retire le code de dessin du texte SFML (tout fonctionne) :
(click to show/hide)
- Et enfin, ce que j'obtiens si jamais je mets le code de dessin OpenGL en commentaire :
(click to show/hide)
Pour ce dernier point, on peut voir qu'il y a un avertissement dans la console. J'ai lu que cela avait été déjà fixé, donc passons, mais je pense que les problèmes sont liés.

En espérant que vous puissiez m'aider, merci d'avance.

2
Général / Dessin d'un grand nombre de carrés mobiles
« le: Juillet 04, 2013, 06:58:33 pm »
Salut !

Débutant dans le C++ et dans la SFML (que j'adore  ;D ), j'ai essayé de faire un petit test pour voir si je pouvais m'en sortir : créer des entités représentées sous forme de carrés et bougeant d'un mouvement aléatoire tout en restant à 60 FPS. Mais j'aimerais en dessiner plusieurs milliers voire millions à l'écran, donc faire un code pas mal optimisé.
Je rappelle que ceci n'a pas d'autre but que de tester la SFML, alors ne cherchez pas de sens caché et profond !


D'abord, j'avais essayé avec un vector de RectangleShapes que je dessinais une par une. Bien sûr, ce n'était pas terrible et au bout d'environ 1000 carrés dessinés à l'écran à chaque tour de boucle, je tombais à 50 FPS. Sachant que tous les 1/60ème de seconde (pour les 60 FPS), je devais donner une nouvelle position à chaque carré puis le dessiner, cela représentait pas mal d'appels à draw.


La seconde idée que j'ai eu et celle pour laquelle je poste ici, est d'utiliser un Vertex Array et donc de ne faire qu'un seul appel à draw. Et après les tests, cela marche nickel, les carrés sont dessinés très rapidement !
Là d'où vient le problème c'est que je n'arrive qu'à en dessiner que 16 000 environ avant d'être à 50 FPS.

J'ai regardé quelle était la fonction qui me ralentissait tout et c'est celle-ci :
// Créé un tableau de Vertex
void Fourmiliere::creerVerArr() {
   
    // On vide le Vertex Array
    verArr.clear();
   
    // Pour toutes les fourmis de la fourmilière ...
    for (int i = 0; i < fourmiliere.size(); ++i) {
       
        // ... on les fait bouger ...
        fourmiliere[i]->Move();
       
        // ... et l'on ajoute les vertex les composant au Vertex Array
        verArr.append(fourmiliere[i]->getVertex()[0]);
        verArr.append(fourmiliere[i]->getVertex()[1]);
        verArr.append(fourmiliere[i]->getVertex()[2]);
        verArr.append(fourmiliere[i]->getVertex()[3]);
    }
}
En fait, cette fonction est appelée à chaque tour de boucle. Elle vide le Vertex Array pour le remplir avec les nouveaux Vertex (4 par carré, "Fourmi"), qui ont changé de position par rapport au tour de boucle précédent puisque les carrés bougent d'un mouvement aléatoire.

Donc je pense que le fait de demander à chaque tour de boucle à bouger chaque Vertex puis à recréer un Vertex Array est vraiment lent ...

Auriez vous une solution ?

Si mon explication n'est pas claire, n'hésitez pas à me poser des questions. Je vous mets mon code entier (assez court et commenté au maximum) : https://www.dropbox.com/s/5zj30bo1w1cyt30/Fourmis1.zip
Vous pouvez appuyer sur la touche directionnelle droite pour créer plusieurs centaines voire milliers de "Fourmis" d'un coup, pour tester.

Merci d'avance,
Totocap.

Pages: [1]
anything