Fin d'exécution brutale de l'exercice P10

Fin d'exécution brutale de l'exercice P10

by David Emmanuel Rossboth -
Number of replies: 6

Bonsoir,

J'ai passé ma journée à essayer de faire marcher l'exercice P10. La compilation se déroule toujours avec succès, sans warning même. Le problème apparaît lorsque j'exécute le programme. En effet, QTcreator m'affiche:

"QOpenGLShaderProgram::uniformLocation(vue_modele): shader program is not linked"

puis, quand j'essaie de débuguer, s'affiche une fenêtre me disant qu'il y a une erreur de type segmentation_fault à la ligne suivante, tirée de l'exemple 5 du tuto sur QT :

"prog.setUniformValue("vue_modele", matrice_vue * point_de_vue);"

J'interprète le premier message d'erreur comme étant une erreur de .pro et la seconde une erreur de conception. Or le fait que les deux coexistent me rend très confus par rapport à la nature profonde de l'erreur. Pourriez-vous m'aider à orienter mes efforts de débuggage ?

In reply to David Emmanuel Rossboth

Re: Fin d'exécution brutale de l'exercice P10

by Raffaele Ancarola -

Les segfault de OpenGL sont souvent dues au fait que'on utilise des outils de

la bibliothèque d'abord qu'elle a étée initialisée dans le programme, donc c'est importante de ne pas appeller des fonctions de qt-opengl avant par rapport à la fonction initializeGL.

Ou mieux dit, suit rigoreusement le schema donné par les 3 fonctions virtuelles de la classe QGLWidget:

  • initializeGL: Initialize ta scene de dessin (shaders, buffers, background, ecc..)
  • resizeGL: Comportement pour chaque fois que la dimension de la fenêtre est mise à jour
  • paintGL: Dessin effective de la scene
Pour avoir un overview de la classe regardez sur la doc: https://doc.qt.io/qt-5/qglwidget.html
In reply to Raffaele Ancarola

Re: Fin d'exécution brutale de l'exercice P10

by Aymeric Thierry Louis Labarbe -

Bonsoir,

Je rencontre la même erreur que celle citée plus haut. Lorsque j'exécute mon programme, mon compilateur (sur QTCreator) m'affiche : 

QOpenGLShaderProgram::uniformLocation(vue_modele): shader program is not linked

ASSERT: "QOpenGLFunctions::isInitialized(d_ptr)" in file ..\..\include/QtGui/../../src/gui/opengl/qopenglfunctions.h, line 2052

En traquant l'erreur on s'est aperçu que l'erreur venait des méthodes "dessine" ( "dessineCube" et "dessineSphere"). Ce qui est étrange c'est que ces méthodes fonctionnent bien lorsqu'on les appelle dans le cadre d'un dessin de ConeSimple, mais pas dans le cadre d'un dessin de Mémoire  (la trace d'une Toupie).  

En debuggant, c'est toujours la ligne suivante qui nous est indiquée comme problématique (que ce soit dans"dessineCube" ou "dessineSphere") : 

prog.setUniformValue("vue_modele", matrice_vue * point_de_vue);

(Ce code n'est pas le notre mais celui du professeur).

Nous avons beau chercher, nous ne voyons pas où est le problème. Pourriez-vous nous aider?


In reply to Raffaele Ancarola

Re: Fin d'exécution brutale de l'exercice P10

by Esther Louise Chauvel -

Bonjour, 

Nous avons exactement le meme probleme et avons essaye de faire ce que vous proposiez, mais ca n'a malheuresement pas resolu le probleme, quelles autres raisons pourrait-il y avoir?

merci d'avance

In reply to Raffaele Ancarola

Re: Fin d'exécution brutale de l'exercice P10

by Giorgio Facelli -

Bonjour,

Moi aussi je rencontre le même problème au même endroit.

De plus je sais pas comment verifier l'ordre d'execution de "InitializeGL()",  "ResizeGL()" et "paintGL()", vu que dans l'executable on fait pas appel explicite à ces methodes.

Merci d'avance,

Giorgio Facelli.


In reply to Raffaele Ancarola

Re: Fin d'exécution brutale de l'exercice P10

by Jean-Cédric Chappelier -

Bon.. pour essayer de vous aider (mais il peut y avoir plusieurs raisons à vos problèmes) :

les shaders sont des morceaux de programmes (un peu comme vos fichiers .o) qui sont ajoutés à votre programme principal.
« shader program is not linked » veut dire qu'un shader annoncé/requis n'est pas trouvé.
La raison principale, je dirais, c'est parce que vous n'avez pas demandé à ce qu'il le soit.

Dans les exemples du cours (le « tuto graphique »), cette demande est faite par la ligne
prog.bind();
dans VueOpenGL::init()
(dans les versions modernes, le bind() appelle le link() et la ligne juste au dessus (le link() donc) n'est plus vraiement nécessaire ; mais elle ne dérange pas)
Il faut donc absolument que cette ligne
prog.bind();
soit exécutée et au bon moment ; c.-à-d. après les « addShaderFromSourceFile ».

Le déroulement normal dans les exemples du cours est le suivant :

  • le main() est lancé
  • qui crée un GLWidget (appel de GLWidget::GLWidget() ; donc)
  • qui appelle GLWidget::initializeGL()
Jusque là, en fait, il n'est s'est encore rien passé (par rapport aux shaders).
Puis finalement :

  • GLWidget::show() est appelé depuis le main()
  • lequel va appeler GLWidget::resizeGL()
  • mais avant le premier appel de GLWidget::resizeGL() ou GLWidget::paintGL(), on appelle GLWidget::initializeGL()
  • qui appelle VueOpenGL::init()
  • qui appelle le fameux bind() [ au BON endroit ]
Il faut donc peut être commencer par vérifier :

  1. que la ligne « prog.bind() » est bien présente au bon endroit
  2. que les appels ci-dessus sont bien faits avant tout dessin.
Pour répondre @Giorgio Facelli, le plus simple pour savoir si une fonction a été appelée est de lui faire laisser une trace dans cout ; p.ex. :
std::cout << "### Calling " << __PRETTY_FUNCTION__ << std::endl;
ou alors, si votre compilateur n'a pas la macro « __PRETTY_FUNCTION__ », écrivez vous-même son nom « à la main ».

En espérant que ceci peut vous aider...
In reply to Jean-Cédric Chappelier

Re: Fin d'exécution brutale de l'exercice P10

by Jean-Cédric Chappelier -

Pour ceux qui ont encore des problèmes avec ces shaders (« shader program is not linked »), en plus des vérifications ci-dessus, une erreur courante est d'avoir plusieurs VueOpenGL différentes (cf aussi https://moodlearchive.epfl.ch/2019-2020/mod/forum/discuss.php?d=34903#p71477).
Assurez vous d'avoir bien qu'une seule et même VueOpenGL pour tous vos dessinables (ou alors refaites l'init + link des shaders de la 2e si vous en voulez vraiment deux ;-) )