Bonjours,
Je suis nouveau sur ce forum et j'ai un problème "étrange". Disons que j'ai fais un chargeur de fichier .OBJ sur VB6 grâce au Tuto Arkham46. Pour nommer et pourvoir modifier les différents objet, j'ai créer un Buffer par objet. Ce qui est étrange, c'est que mon programme tourne pendant 20 secondes, puis VB bloque et impossible de le relancer pendant 1 heure (même en redémarrant le pc). C'est à dire le problème est intermittent.
En avançant dans mon code en pas-à-pas j'ai pue voir qu'il plantait au moment du glDrawElements. Avez vous déjà eu ce problème, on dirait qu'il y a une mémoire qui ce remplie.
Pour charger mes buffers, j'utilise ce code en le bouclant pour chaque matériaux du .obj:
Pour l'affichage je boucle dans une boucle do-loop avec un DoEvents :
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
84
85
86
87
88 Public Sub cube() ' Crée la liste pour le cube ReDim vertexarray(9 * vertex(obj, 0) - 1) As Single '3coordonnées*nbface*3vertex ReDim ColorArray(9 * vertex(obj, 0) - 1) As Single ReDim NormalArray(9 * vertex(obj, 0) - 1) As Single ReDim TexCoordArray(9 * vertex(obj, 0) - 1) As Single ReDim indicearray(1 To 3 * vertex(obj, 0)) As Long ReDim CubeArray(1 To 36 * vertex(obj, 0)) As Single Dim i As Integer Dim j As Integer Dim k As Byte For i = 0 To 6 * vertex(obj, 0) - 1 DoEvents vertexarray(i) = vertex(obj, i + 4) NormalArray(i) = normale(obj, i + 4) TexCoordArray(i) = texture(obj, i + 4) ColorArray(i) = 1 If selected = vertex(obj, 1) Then For j = 1 To 6 * vertex(obj, 0) - 1 ColorArray(j - 1) = 1 ColorArray(j) = 0.4 ColorArray(j + 1) = 0.8 j = j + 2 Next End If Next i j = 0 For i = 1 To 36 * vertex(obj, 0) For k = 0 To 2 CubeArray(i + k) = vertexarray(j) j = j + 1 Next k i = i + 11 Next i j = 0 For i = 4 To 36 * vertex(obj, 0) For k = 0 To 2 CubeArray(i + k) = NormalArray(j) j = j + 1 Next k i = i + 11 Next i j = 0 For i = 7 To 36 * vertex(obj, 0) For k = 0 To 2 CubeArray(i + k) = TexCoordArray(j) j = j + 1 Next k i = i + 11 Next i j = 0 For i = 10 To 36 * vertex(obj, 0) For k = 0 To 2 CubeArray(i + k) = ColorArray(j) j = j + 1 Next k i = i + 11 Next i Open App.Path & "\cubearray.txt" For Output As #1 For i = 1 To 36 * vertex(obj, 0) Print #1, CubeArray(i); Next i Close #1 For i = 1 To 3 * vertex(obj, 0) indicearray(i) = indice(obj, i) - 1 Next i Open App.Path & "\indicearray.txt" For Output As #1 For i = 1 To 3 * vertex(obj, 0) Print #1, indicearray(i); Next i Close #1 ' Données de vertex glBindBuffer GL_ARRAY_BUFFER, CubeBuffers(2 * obj + 1) glBufferData GL_ARRAY_BUFFER, UBound(CubeArray) * Len(CubeArray(1)), VarPtr(CubeArray(1)), GL_STREAM_DRAW glBindBuffer GL_ARRAY_BUFFER, 0& ' Données d'indices glBindBuffer GL_ELEMENT_ARRAY_BUFFER, CubeBuffers(2 * obj + 2) glBufferData GL_ELEMENT_ARRAY_BUFFER, UBound(indicearray) * Len(indicearray(1)), VarPtr(indicearray(1)), GL_STATIC_DRAW glBindBuffer GL_ELEMENT_ARRAY_BUFFER, 0&
Merci de m'aider, j'ai peut-être mis beaucoup. Je suis surement pas très clair mais je vais essayer d'envoyer le code complet avec tous les modules dans la pièce jointe.
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 Do DoEvents 'Render Views... glView1_Paint Loop Until Done = True Private Sub glView1_Paint() wglMakeCurrent hDC1, hglRC1 Render End Sub ' Rendu de la scène Public Sub Render() ' Passage en matrice de modélisation-visualisation glMatrixMode GL_MODELVIEW ' Initialisation de la matrice glLoadIdentity ' Position de la caméra gluLookAt 0, 0, gZoom, 0, 0, 0, 0, 10, 0 glRotated gRotateX, 1, 0, 0 glRotated gRotateY, 0, 1, 0 ' Vide les buffers couleur et profondeur glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT ' Sauvegarde la matrice glPushMatrix For obj = 0 To UBound(vertex, 1) - 1 ' Affecte la texture glBindTexture GL_TEXTURE_2D, gTexture(obj) ' Filtrage de la texture glTexParameterf GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR glTexParameterf GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR glEnableClientState GL_VERTEX_ARRAY glEnableClientState GL_COLOR_ARRAY glEnableClientState GL_NORMAL_ARRAY glEnableClientState GL_TEXTURE_COORD_ARRAY ' Position des données à utiliser glBindBuffer GL_ARRAY_BUFFER, CubeBuffers(2 * obj + 1) glVertexPointer 3, GL_FLOAT, 48, ByVal 0& glNormalPointer GL_FLOAT, 48, ByVal 12& glTexCoordPointer 3, GL_FLOAT, 48, ByVal 24& glColorPointer 3, GL_FLOAT, 48, ByVal 36& ' Utilisation des indices glBindBuffer GL_ELEMENT_ARRAY_BUFFER, CubeBuffers(2 * obj + 2) glPushMatrix glPushName vertex(obj, 1) glDrawElements GL_TRIANGLES, 3 * vertex(obj, 0), GL_UNSIGNED_INT, ByVal 0& glPopName glPopMatrix glDisableClientState GL_VERTEX_ARRAY glDisableClientState GL_COLOR_ARRAY glDisableClientState GL_NORMAL_ARRAY glDisableClientState GL_TEXTURE_COORD_ARRAY ' Désactive les buffers glBindBuffer GL_ARRAY_BUFFER, 0& glBindBuffer GL_ELEMENT_ARRAY_BUFFER, 0& ' N'affecte aucune texture glBindTexture GL_TEXTURE_2D, 0 Next ' N'affecte aucune texture glBindTexture GL_TEXTURE_2D, 0 ' Restaure la matrice glPopMatrix glPopName 'Echange les bufffer If mode = GL_RENDER Then SwapBuffers hDC1 End Sub
Merci
Partager