Bonjour à tous.

Voila je débute avec open gl, j'ai écris un programme en delphi qui dessine une sphère en 3D points par points avec glbegin(GL_POINTS). Lorsque fait bouger la souris, la sphère tourne si le bouton gauche est enfoncé.

La rotation est fluide mais des lignes horizontales de la même couleur que le fond de la scène apparaissent puis disparaissent lorsque la sphère est redessinée.

J'ai parcouru les autres sujets et je n'ai rien trouvé qui puisse m'aider, j'utilise le double buffer et la synchronisation verticale est activée. Lorsque je fais un screenshot de la scène et que je le colle sous paint, on ne voit pas les lignes. Je ne saurai donc pas joindre une image du phénomène.

Voilà le gros du code :

Création de la fenêtre opengl :
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
 
procedure TFrmOpenGL.FormCreate(Sender: TObject);
begin
      degx:=0;
      degy:=0;
      degz:=0;
      flag_rotation:=false;
     {Initialisation de OpenGL en mode Double tampon}
     InitOpenGL( FrmOpenGL.Canvas.Handle, 16, True );
 
     {Couleur de vidage}
     glClearColor( 0.0, 0.0, 0.0, 0.0 );
     glPointSize(4);
     {Activation du test de profondeur}
     glEnable(GL_DEPTH_TEST);
Le reste de cette fonction consiste à remplir des tableaux contenant les positions x,y,z et les couleurs r,g,b de chaque point à partir d'un fichier texte.

La fonction InitOpenGL provient d'un "unit" récupéré sur internet, je ne pense pas que le problème vienne de là. Voici le reste du code:

Redimensionnement de la fenetre:
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
 
procedure TFrmOpenGL.FormResize(Sender: TObject);
{Objectif :Définission du champs de vision en fonction du contrôle (FrmOPenGL).}
begin
     {Empêcher les division par ZERO}
     If ClientHeight = 0 Then
        ClientHeight := 1;
 
     {Spécification de l'espace disponible sur le contrôle fenêtré.}
     glViewport( 0, 0, ClientWidth, ClientHeight );
     {Rendre la matrice de project active pour définir un nouveau champs de
     vision}
     glMatrixMode( GL_PROJECTION );
     glLoadIdentity();
 
     {Création d'une nouvelle matrice de projection.}
     gluPerspective( 45, ClientWidth / ClientHeight,0.1 , 800 );
 
     {Rafraîchir le contenu de la fenêtre}
     FrmOpenGL.Invalidate;
end;
Dessiner la scène :
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
74
75
76
77
78
79
80
81
82
83
 
procedure TFrmOpenGL.FormPaint(Sender: TObject);
 
var i:integer;
 
begin
 
 
     SwapBuffers(Canvas.Handle);
     glClear( GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT);
 
     {On réénitialise la matrice modélisation-visualisation}
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity;
 
     glPushMatrix;
     glLoadIdentity;
     glTranslated( 0,0, -600.0 );
     glrotated(degx,1,0,0);
     glrotated(degy,0,1,0);
     glrotated(degz,0,0,1);
 
      for i:=0 to (nbre_points-1)  do
      begin
 
 
                glbegin(gl_points);
                        glColor3f( r[i], g[i], b[i]);
                        glVertex3f( x[i],y[i],z[i] );
                glend();
 
      end;
 
      glPopMatrix;
      glPushMatrix;
      glLoadIdentity;
      glTranslated( -250,-200, -600.0 );
      glrotated(degx,1,0,0);
      glrotated(degy,0,1,0);
      glrotated(degz,0,0,1);
 
      glbegin(gl_lines);
                glcolor3f(0,0,1);
                glvertex3f(0,0,0);
                glvertex3f(0,0,-100);
      glend();
 
      glbegin(gl_lines);
                glcolor3f(0,0,1);
                glvertex3f(0,0,0);
                glvertex3f(0,100,0);
      glend();
 
     glbegin(gl_lines);
                glcolor3f(0,0,1);
                glvertex3f(0,0,0);
                glvertex3f(100,0,0);
     glend();
 
     glbegin(gl_triangles);
                glvertex3f(100,0,0);
                glvertex3f(95,5,0);
                glvertex3f(95,-5,0);
     glend();
 
     glbegin(gl_triangles);
                glvertex(0,100,0);
                glvertex(-5,95,0);
                glvertex(5,95,0);
     glend();
 
     glbegin(gl_triangles);
                glvertex(0,0,-100);
                glvertex(0,-5,-95);
                glvertex(0,5,-95);
     glend();
 
     glPopMatrix;
 
     glFinish;
 
     SwapBuffers( Canvas.Handle );
end;
Et enfin la rotation avec la souris :
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
 
procedure TFrmOpenGL.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var dx,dy:integer;
begin
        if(flag_rotation=true) then
        begin
                dx:=Mx-x;
                dy:=My-y;
                Mx:=x;
                My:=y;
                degx:=degx-dy;
                degy:=degy-dx;
                FrmOpenGL.Invalidate;
 
        end;
end;
Voilà, si il vous faut plus de renseignements je serai heureux de vous les donner. J'espère avoir été assez clair pour que vous puissiez m'aider.

J'ai lu que le swapbuffer se faisait par recopie du back_buffer vers le front buffer et comme il y a un nombre assez important de points (environ 100.000), je me dis que c'est peut-être la recopie du buffer qui prend trop de temps et qui crée ce phénomène mais je ne suis pas sur du tout.

D'avance merci pour votre aide.