Précédent   Forum du club des développeurs et IT Pro > C et C++ > Bibliothèques > Qt
Qt Forum d'entraide technique sur la bibliothèque Qt. Avant de poster -> F.A.Q Qt
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/11/2012, 00h20   #1
fab13
Invité de passage
 
Inscription : novembre 2003
Messages : 47
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 47
Points : 4
Points : 4
Par défaut Conversion OpenGL/GLUT vers Qt/OpenGL : problème d'affichage

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 :
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 :
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 :
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 ?
fab13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2012, 10h51   #2
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 381
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 10 381
Points : 39 576
Points : 39 576
Bonjour,

Citation:
Est-ce que je peux me passer de la méthode "paintGL()" ?
Oui en théorie

Citation:
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)".
Alors mettez glClearColor(0.5,0.2,0.8,1.0) car mettre du noir alors que c'est la couleur que peut donner par défaut le système n'est pas un test significatif.
__________________
Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h28.


 
 
 
 
Partenaires

Hébergement Web