ptitchep | Bonjour,
J'ai un bout de code qui utilise GLFW et glew pour afficher de la 3D dans une
fenêtre. Honnêtement j'ai un peu copié/collé l'init pour pouvoir me concentrer
sur la partie opengl.
Mon code fonctionne très bien sur 2 machines différentes mais pas sur une
troisième. J'ai une distribution Archlinux à jour sur les 3 machines (donc
normalement tout pareil). La seule différence est que la 3ème possède une carte
graphique nvidia alors que les autres utilisent un chipset intégré intel.
Voici l'init:
Code :
- Afficheur::Afficheur(unsigned p_largeur,
- unsigned p_hauteur,
- const Carte& p_carte) throw(AFFICHEUR_ERREUR):
- m_xcamera(p_carte.largeur() / 2),
- m_ycamera(p_carte.hauteur() / 2),
- m_zcamera(p_carte.largeur()),
- m_xvisee(p_carte.largeur() / 2),
- m_yvisee(p_carte.hauteur() / 2),
- m_zvisee(0)
- {
- if (!glfwInit())
- {
- std::cerr<<"Impossible de démarrer GLFW"<<std::endl;
- throw AFFICHEUR_ERREUR_GLFW_INIT;
- }
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
- glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
- glfwWindowHint(GLFW_SAMPLES, 8);
- m_fenetre = glfwCreateWindow(p_largeur, p_hauteur, "Terrain", NULL, NULL);
- if (!m_fenetre)
- {
- std::cerr<<"Impossible de créer la fenêtre"<<std::endl;
- glfwTerminate();
- throw AFFICHEUR_ERREUR_FENETRE_INIT;
- }
- glfwMakeContextCurrent(m_fenetre);
- glewExperimental = GL_TRUE;
- glewInit();
- const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string
- const GLubyte* version = glGetString(GL_VERSION); // version as a string
- std::cout<<"Renderer: "<<renderer<<std::endl;
- std::cout<<"OpenGL version supported "<<version<<std::endl;
- glEnable(GL_DEPTH_TEST); // enable depth-testing
- glDepthFunc(GL_LESS); // depth-testing interprets a smaller value as "closer"
- m_afficheurCarte = new AfficheurCarte(p_carte);
- m_stop = false;
- m_thread = std::thread(&Afficheur::affichage, this, p_largeur, p_hauteur);
|
Et le thread d'affichage:
Code :
- void Afficheur::affichage(float p_largeur,
- float p_hauteur)
- {
- glfwMakeContextCurrent(m_fenetre);
- glm::mat4 projection = glm::perspective(100.0f, p_largeur / p_hauteur, 0.1f, 2000.0f);
- glm::mat4 view;
- // Model matrix : an identity matrix (model will be at the origin)
- glm::mat4 model = glm::mat4(1.0f);
- // Our ModelViewProjection : multiplication of our 3 matrices
- glm::mat4 MVP = projection * view * model;
- glm::vec3 lightPos = glm::vec3(m_xcamera,m_ycamera,300);
- while(!m_stop)
- {
- view = glm::lookAt(glm::vec3(m_xcamera, m_ycamera, m_zcamera),
- glm::vec3(m_xvisee, m_yvisee, m_zvisee),
- glm::vec3(0,-1,0));
- MVP = projection * view * model;
- titre();
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- m_afficheurCarte->affichage(MVP, model, view, lightPos);
- glfwPollEvents();
- glfwSwapBuffers(m_fenetre);
- }
- }
|
Tout fonctionne bien sur les 2 premières machines mais sur la 3ème j'ai un
simple écran noir. À noter que la fonction titre() fonctionne tout de même (elle
affiche les fps dans la barre de titre).
Si je remplace:
Code :
- m_thread = std::thread(&Afficheur::affichage, this, p_largeur, p_hauteur);
|
Par:
Code :
- affichage(p_largeur, p_hauteur);
|
L'affichage fonctionne. Sauf que bien sûr je n'ai plus la main...
J'en déduis donc qu'il y a un problème avec le multithreading mais pourquoi sur
une seule machine? Et comment résoudre ça?
Merci.
---------------
deluser --remove-home ptitchep
|