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 :
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 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); }
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 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(); }
Est-ce que je peux me passer de la méthode "paintGL()" ?
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); }
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 ?
Partager