IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Windows XP — impossible d'avoir un QOpenGLFunctions fonctionel avec QQuickItem [2D/3D]


Sujet :

Qt

  1. #1
    Membre éprouvé
    Homme Profil pro
    -
    Inscrit en
    Octobre 2011
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : -

    Informations forums :
    Inscription : Octobre 2011
    Messages : 344
    Points : 1 235
    Points
    1 235
    Par défaut Windows XP — impossible d'avoir un QOpenGLFunctions fonctionel avec QQuickItem
    Bonjour je dois coder une application pour le boulot. Comme il manque de matos, ils m'ont refilé un vieux PC sous windows XP.
    Ma carte supporte openGL 2.0
    J'amerais au moins utiliser les buffers openGL et pas les antiquités glBegin() et glEnd(), mais impossible de faire fonctionner QOpenGLFunctions !
    Mais impossible d'avoir les QOpenGLFunctions qui fonctionnent*! (voir viewer.cpp:19)
    Il systématiquement foire quand je tente de charger dynamiquement les fonctions avec le contexte actuel (que j’ai pas à construire manuellement si j'arrive à appeler glClear() non*? )

    Je me base sur l'example http://qt-project.org/doc/qt-5/qtqui...l-example.html, où j'ai changé Squircle en Viewer.

    viewer.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #ifndef VIEWER_H
    #define VIEWER_H
     
     
    //#include <GL/glew.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
     
    #include <QQuickItem>
    //#include <QOpenGLShaderProgram>
     
     
    class Viewer : public QQuickItem
    {
        Q_OBJECT
     
        Q_PROPERTY(qreal t READ t WRITE setT NOTIFY tChanged)
     
    public:
        explicit Viewer(QQuickItem *parent = 0);
        ~Viewer();
     
        qreal t() const { return mutable_members.t; }
        void setT(qreal t);
     
    signals:
        void tChanged();
     
    public slots:
        void prerender();
        void render();
        void cleanRender();
    protected slots:
        void on_windowChanged(QQuickWindow *self);
    protected:
        typedef struct
        {
            qreal t;
        } ui_members;
        ui_members mutable_members;
        ui_members copied_members;
     
        GLuint vbufferOIdx;
    };
     
    #endif // VIEWER_H
    viewer.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    #include "viewer.h"
    #include <QQuickWindow>
    #include <QOpenGLFunctions>
    #include <QOpenGLContext>
     
     
    #include <iostream>
     
    // Most of the following code is inspired from
    // <http://qt-project.org/doc/qt-5/qtquick-scenegraph-openglunderqml-example.html>
     
    Viewer::Viewer(QQuickItem *parent) :
        QQuickItem(parent),
        mutable_members(),
        copied_members(mutable_members),
        vbufferOIdx(0),
    {
     
        //Cette ligne foire avec une segmentation fault.
        //Faire un héritage n'a guère plus de succès, il signale juste que qu'une assertion foire*: “context” in file opengl/qopenglfunctions.cpp
        QOpenGLFunctions* const glfcts = window()->openglContext()->functions();
     
        glfcts->glGenBuffers(1, &vbufferOIdx);
        glfcts->glBindBuffer(GL_ARRAY_BUFFER, vbufferOIdx);
        glfcts->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); //done by above line
        glfcts->glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
        glfcts->glEnableVertexAttribArray(vbufferOIdx);
     
        connect( this, SIGNAL(windowChanged(QQuickWindow*)), this, SLOT(on_windowChanged(QQuickWindow*)) );
     
    }
     
    Viewer::~Viewer()
    {
        QOpenGLFunctions* const glfcts = window()->openglContext()->functions();
        glfcts->glDeleteBuffers(1, &vbufferOIdx);
    }
     
    void Viewer::on_windowChanged(QQuickWindow *self)
    {
        if(self)
        {
            connect( self, SIGNAL(beforeSynchronazing()), this, SLOT(prerender()), Qt::DirectConnection );
            connect( self, SIGNAL(beforeRendering()), this, SLOT(render()), Qt::DirectConnection );
            self->setClearBeforeRendering(false);
        }
    }
     
    void Viewer::prerender()
    {
        copied_members = mutable_members;
    }
     
    void Viewer::render()
    {
        glClearColor(0, 0, 0, 1);
        glClear(GL_COLOR_BUFFER_BIT);
    }
     
    void Viewer::cleanRender()
    {
        //nothing to do so far
    }
     
    void Viewer::setT(qreal t)
    {
        if (t == mutable_members.t)
            return;
        mutable_members.t = t;
        emit tChanged();
        if (window())
            window()->update();
    }
    Toute aide serait la bienvenue !!!
    Merci d'avance*!!!

  2. #2
    Membre éprouvé
    Homme Profil pro
    -
    Inscrit en
    Octobre 2011
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : -

    Informations forums :
    Inscription : Octobre 2011
    Messages : 344
    Points : 1 235
    Points
    1 235
    Par défaut
    D'accord. Apparement on ne peut pas utiliser initializeOpenGLFunctions() dans le constructeur pour un raison obscure, il faut attendre plus tard pour l'appeler.
    J'ai utilisé un bool pour retenir si initializeOpenGLFunctions() a été appelé, et je l'appelle au début de la fonction de rendu si nécessaire…

    Si quelqu'un peut expliquer ce qui se passe, qu'il se sente libre de le faire…

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 825
    Points : 218 208
    Points
    218 208
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    Peut être qu'il faut qu'un contexte soit initialisée, ou au moins une fenêtre ? Mais cette première réponse est surtout une hypothèse, après, cela dépend aussi de ce que fait QOpenGLFunctions, ou comment il le fait.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/10/2010, 13h09
  2. Réponses: 2
    Dernier message: 17/05/2007, 01h44
  3. Windows Update impossible, problème installation WGA
    Par iubito dans le forum Windows XP
    Réponses: 3
    Dernier message: 16/12/2005, 09h58
  4. Impossible d'avoir un arrière plan en utilisant CSS
    Par Tartenpion dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 21/06/2005, 15h00
  5. [JWindow + KeyListener] Impossible d'avoir un KeyEvent
    Par Pascmar dans le forum Agents de placement/Fenêtres
    Réponses: 14
    Dernier message: 19/07/2004, 18h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo