Bonjour,
Je viens requérir vôtre aide parceque je débute depuis quelques mois en OpenGl et je suis actuellement, comme beaucoup de passionné je suppose, en train d'essayer de développer un petit Moteur 3D. J'ai donc commencé par construire une architecture de gestionnaire basique.
Ensuite j'ai implémenté les objets 3D de mon moteur en utilisant les méthodes de base présentées sur la majorité des tutos c'est à dire les glVertex3f et autres
(pas de gestion de lumières pour le moment l'objectif étant simplement de pouvoir afficher un bon nombre d'objet avec un mode te texture tres simple )
J'ai donc ensuite créé une dll de mon moteur puis je l'ai essayée dans une application à part. Tout marchait donc normalement jusque la ... le seul probleme c'était l'efficacité ^o) parceque si je comprend bien le probleme c'est que cette méthode la ne profite vraiment pas énormément des accelerations offertes par les cartes récentes.
J'ai donc commencé à me renseigner et j'ai donc découver les VBO (si j'ai bien compris) qui s'utilise avec en gros des tableau de vertex que l'on passe à OpenGl pour qu'il les stoque dans dans une zone référencée par l'indice que l'on récupère grâce à glGenBuffersARB( nbre de buffers , tableauNumeros );
et que l'on assigne ensuite avec :
on peut ensuite détruire notre array qui a été copié par OpenGL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOVertices ); glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*3*sizeof(float), m_pVertices, GL_STATIC_DRAW_ARB );
une fois que cette étape de chargement à été faite vien la méthode Draw de l'objet : ( et je pense que c'est ici que se trouve le probleme mais je ne le cerne pas)
Voila et donc dans mon gestionaire j'ai un tableau de pointeur vers des objets sachant que si deux objets sont les mêmes ils "partagent/ont les mêmes" références de buffers.
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 void Objet::Draw() { //applique les transformations de positions moveToObjectif(); glPushMatrix(); glTranslatef(P.getX(),P.getY(),P.getZ()); glRotated(P.getAX()+Original.getAX(),1,0,0); glRotated(P.getAY()+Original.getAY(),0,1,0); glRotated(P.getAZ()+Original.getAZ(),0,0,1); //transformation d'echelle glScalef(S.getX(),S.getY(),S.getZ()); glEnableClientState( GL_VERTEX_ARRAY ); glEnableClientState( GL_TEXTURE_COORD_ARRAY ); if(textured && T != NULL) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, T->getId()); } glColor4f(C.getR(),C.getG(),C.getB(),C.getA()); glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOVertices ); glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL ); glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOTexCoords ); glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL ); glDrawArrays( GL_TRIANGLES, 0, m_nVertexCount ); if(textured && T != NULL) { glDisable(GL_TEXTURE_2D); } glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glDisableClientState( GL_VERTEX_ARRAY ); glDisableClientState( GL_TEXTURE_COORD_ARRAY ); glPopMatrix(); }
En l'occurence pour remarquer mon bug j'ai voulu faire un champ de cubes mais (et voila enfin mon probleme) il n'y a qu'une certaine partie des cubes qui s'affichent ..... et ceux qui ne s'affichent pas ont une répartition plus ou moins aléatoire ......
donc voila si il vous manque des informations, que vous remarquez des erreures qui n'ont pas de rapport, ou que j'ai di des bétises sur le fonctionnement n'hésitez pas à éclairer ma lanterne!!!
en vous remerciant d'avance
Seb
Partager