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*!!!