Je travaille actuellement sur la conversion d'une appli en GLUT/OpenGL vers Qt/OpenGL. Pour cela, j'utilise une classe dérivée de QGLWidget nommée "GLWidget" pour l'affichage de l'animation. Mon problème est que j'aimerais garder le fonctionnement de la fonction GLUT displayfunc de la première version : dans la boucle principale GLUT, j'utilise "glutDisplayFunc(displayfunc);"

Donc dans la version Qt/OpenGL, j'essaie la chose suivante :

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
    void GLWidget::initializeGL()
    {
        LoadGLTextures();  // load the textures.
        glClearColor(0.0 ,0.0, 0.0, 0.0);
        glMatrixMode(GL_PROJECTION);    
        glLoadIdentity();
 
        m_program = _compileProgram(vertexShader);
 
        glClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE);
 
        // memsize of GPU data 
        unsigned int memSize = sizeof(cl_double4) * 4 * Galaxy->getNumParticles();
 
        createVBO(memSize);
 
        m_timer = new QTimer(this);
        connect(m_timer, SIGNAL(timeout()), this, SLOT(displayfunc()));
        m_timer->start(30); 
    }
avec displayfunc :

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
 
    void GLWidget::displayfunc()
    {
     if (Galaxy->isFirstLaunch)
        {
        gluLookAt (0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
        glScalef(0.03f, 0.03f, 0.03f);
        drawPoints();
        //Calling kernel for calculatig subsequent positions
        Galaxy->runCLKernels();
        Galaxy->isFirstLaunch = false;
        glFlush(); 
        swapBuffers();     
        return;
        }
       else {
              clWaitForEvents(1, &Galaxy->glEvent);
              drawPoints();
          //Calling kernel for calculatig subsequent positions
              Galaxy->runCLKernels();
              glFlush(); 
              swapBuffers();           
             }
         update();
    }
et la routine drawPoints :

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
    void GLWidget::drawPoints()
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glClear(GL_DEPTH_BUFFER_BIT);
        glEnable(GL_POINT_SPRITE);
        glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
        glEnable(GL_VERTEX_PROGRAM_POINT_SIZE_NV);
 
        glEnable(GL_BLEND);
        glBlendFunc (GL_SRC_ALPHA, GL_ONE);    
 
            glUseProgram(m_program);
            glUniform1f( glGetUniformLocation(m_program, "pointRadius"), m_particleRadius );
            glUniform1f( glGetUniformLocation(m_program, "pointScale"),m_pointScale);  
 
            GLuint vbo_disk;
 
            glBindBuffer(GL_ARRAY_BUFFER, vbo_disk);
            glVertexPointer(4, GL_DOUBLE, 4*sizeof(double), Galaxy->pos);
            glEnableClientState(GL_VERTEX_ARRAY);
 
            glColor4f(1.0f, 1.0f, 1.0f, 0.1f);
            glDrawArrays(GL_POINTS, 0, Galaxy->getNumParticles_disk());
 
            glBindBuffer(GL_ARRAY_BUFFER, 0);
            glDisableClientState(GL_VERTEX_ARRAY);
 
        GLuint vbo_halo;
 
            glBindBuffer(GL_ARRAY_BUFFER, vbo_halo);
            glVertexPointer(4, GL_DOUBLE, 4*sizeof(double), &Galaxy->pos[Galaxy->getNumParticles_disk()]);
            glEnableClientState(GL_VERTEX_ARRAY);
 
            glColor4f(0.0f, 0.0f, 1.0f, 0.1f);
            glDrawArrays(GL_POINTS, 0, Galaxy->getNumParticles_halo());
 
            glBindBuffer(GL_ARRAY_BUFFER, 0);
            glDisableClientState(GL_VERTEX_ARRAY); 
 
            glDisable(GL_BLEND);        
        glDisable(GL_POINT_SPRITE);
    }
Est-ce que je peux me passer de la méthode "paintGL()" ?

J'ai essayé aussi de rajouter makeCurrent() dans toutes les fonctions utilisant des fonctions OpenGL mais rien ne s'affiche dans le GLWidget, juste un écran noir à cause de "glClearColor(0.0 ,0.0, 0.0, 0.0)".

Pourriez-vous m'aider s'il vous plaît ?