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.


Messages - 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 / Re : Dessin d'un grand nombre de carrés mobiles
« le: Juillet 05, 2013, 11:31:40 am »
Oui, je pense que oui :)

Et bien merci pour ton aide, Laurent, je vais essayer d'optimiser le code avec les dernières astuces que tu m'as filé.

3
Général / Re : Dessin d'un grand nombre de carrés mobiles
« le: Juillet 04, 2013, 10:27:35 pm »
Merci pour l'article, il a l'air super  :)

Mais même si dans ma boucle limitée à 60 tours par seconde je traite les update et le dessin (ce que je vais changer grâce à l'article), je devrais pouvoir gérer plus de Fourmis que ça, non ? Et pourquoi dès le début je n'arrive pas à atteindre les 60 FPS mais reste scotché à 58 ?  ???

Dans le tutoriel sur les Vertex, tu disais que "les cartes graphiques modernes sont plutôt conçues pour traiter les triangles par lots de plusieurs milliers, voire millions.".

4
Général / Re : Dessin d'un grand nombre de carrés mobiles
« le: Juillet 04, 2013, 09:31:38 pm »
Merci, ça a déjà amélioré un peu (5000 Fourmis de plus, donc 21 000 environ).

Mais il doit y avoir un sérieux problème d'optimisation dans mon code car dès le départ je commence à 57-58 FPS avec une seule Fourmi affichée ... Cela ne vient peut être pas de ma compréhension de la SFML mais de ma compréhension du C++ (peut être une erreur bête), comme je suis débutant ...


Edit : En enlevant ma limitation des FPS dans le main grâce à la Clock (pour ne dessiner que toutes les 1/60ème de seconde) et en passant par une FrameLimit à 60 sur ma RenderWindow, j'arrive à 100 000 Fourmis pour 50 FPS ... Je ne comprends pas trop pourquoi.

Edit 2 : En fait le FPS n'est carrément pas stable, du coup, c'est pas pratique.

5
Général / Re : Dessin d'un grand nombre de carrés mobiles
« le: Juillet 04, 2013, 08:11:19 pm »
Donc au lancement, dans les trois situations (normale, test 1 et test 2), je ne suis déjà qu'à 58 FPS au lieu de 60 ...

Après, j'ai créé des "Fourmis" jusqu'à tomber à 50 FPS (bon, ce n'est pas précis, mais ça montre quand même l'écart) :
- situation normale : 16 000 "Fourmis"
- test 1 : 100 000 "Fourmis"
- test 2 : 40 000 "Fourmis"

6
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]