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 :
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.
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);
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:
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 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;
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
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;
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.
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;
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.
Partager