Bonjour !
Félicitations pour cette interface très intuitive et propre que je prends plaisir à exploiter.
J'ai décidé d'apprendre à me servir de l'API
OpenGL (en version 4+) avec le système de fenêtrage de la
SFML, mais après avoir implémenté dans ma boucle une mise à jour de mon tableau de vertex, je lance la compilation et observe avec horreur un rafraichissement de l'ordre d'
une image par seconde, je m'empresse de coller un
cout dans la boucle pour m'apercevoir qu'elle tourne pourtant à la vitesse prévue :
60 itérations/sec, je tente ensuite de voir ce que
Fraps pourrait me dire mais rien à faire il ne m'affiche pas le framerate et ne m'enregistre rien alors que sur mes autres appli OGL/DX il opère correctement, je me demande alors si
OpenGL ne serai pas en train de se tourner les pouces.
Voici une version compressée qui donne le résultat insatisfaisant énoncé ci-dessus :#include <GL/glew.h>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <random>
#include <vector>
int main()
{
sf::Window window(sf::VideoMode(800, 600), "OpenGL", sf::Style::Default, sf::ContextSettings(32));
window.setVerticalSyncEnabled(true);
glewExperimental = GL_TRUE;
glewInit();
// Vertices Array Initialization
int nbVertices = 1000;
std::vector<float> vertices;
for (auto i(0); i < nbVertices*2; ++i)
vertices.push_back(.0f);
bool running = true;
while (running)
{
// Events Capture
sf::Event windowEvent;
while (window.pollEvent(windowEvent))
if(windowEvent.type == sf::Event::Closed)
running = false;
// Update Vertices Array
auto const seed = std::time(nullptr);
std::default_random_engine engin { seed };
std::mt19937_64 gen { engin() };
std::uniform_real_distribution<float> disp { -1.0f, 1.0f };
for (auto i(0); i < nbVertices*2; ++i)
vertices[i] = disp(gen);
// Clean the screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Define an array of generic vertex attribute data
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, &vertices[0]);
glEnableVertexAttribArray(0);
// Drawing in the back-buffer
glDrawArrays(GL_POINTS, 0, nbVertices);
glDisableVertexAttribArray(0);
// Switch Buffer
window.display();
}
return 0;
}
Après d'innombrables tests et remaniements de codes infructueux je crée un nouveau projet pour tester un code minimal et je vois que Fraps reste toujours muet.
Le code (celui du tuto de votre site)#include <GL/glew.h>
#include <SFML/Window.hpp>
// #include <SFML/OpenGL.hpp> à la place #include <GL/glew.h> me donne le même résultat
int main()
{
sf::Window window(sf::VideoMode(800, 600), "OpenGL", sf::Style::Default, sf::ContextSettings(32));
window.setVerticalSyncEnabled(true);
bool running = true;
while (running)
{
// Events Capture
sf::Event windowEvent;
while (window.pollEvent(windowEvent))
{
switch (windowEvent.type)
{
case sf::Event::Closed:
running = false;
break;
case sf::Event::KeyPressed:
if (windowEvent.key.code == sf::Keyboard::Escape)
running = false;
break;
}
}
// Display
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
window.display();
}
return 0;
}
Infos:*
Environnement :
-
Windows 7 Pro 64Bits & SP1*
IDE : -
Code::Blocks 13.12 (le dernier en date) paramétré pour utiliser le compilateur
GCC 5.1 et donc le
C++14 ainsi que les lib et API suivantes.
*
Lib & API (correctement reconnus par le linker de C::B d'après son debuggeur qui reste muet à la compilation) :
-
SFML 2.3.1 compilé pour tourner sur mon compilo (linker : sfml-graphics, sfml-window et sfml-system)
-
GLEW 1.13.0 " " " (linker : libglew32)
-
OpenGL (linker : opengl32)
-
Lib Dynamiques : copiées dans les répertoires bin du projet C::B
-
Dossiers include (.h) : définis
*
Matériel : -
processeur Intel Core i5 670 @ 3.47GHz
-
Carte graphique AMD Radeon HD 6800 Series
-
Mémoire 2 * 4Go DDR3
-
Moniteur principal : 24" en 1920*1080 (pas de soucis de framerate).
-
Moniteur secondaire : 24" 1920*1200 (pas de soucis de framerate et mon application de base donne le même résultat sur celui-ci).
*
Pilote Graphique à jour (vérifié à l'instant: 08/09/15 18h) : 15.20.1062.1003-150728a1-187447C
Fraps devrait t-il fonctionner sur une sf:window de la SFML ?
Comment s'assurer qu'OpenGL opère bien si ce n'est en contrôlant la présence du framerate de fraps dans la fenêtre ?
Et pour finir :
Est-ce que cette histoire de sf::window.display() qui ne se lance pas à chaque tour de boucle mais une fois par seconde vous parle ? Je peux vous fournir le code (en essayant de l'alléger/éclaircir le plus possible) mais ça risque de faire un peu long surtout que le problème se situe peut-être au tout début du projet.
En vous remerciant
Edition (19h30) : J'ai intégré le code bugué dans le post.