[OpenGL] Programme utilisant Vertex Buffer plante à l'exécution

Le côté programmation du développement d'un jeu vidéo.

[Résolu] Programme utilisant Vertex Buffer plante à l'exécution

Messagepar MrPacane » 22 Avr 2010, 15:48

Bonjour,

j'essaie d'afficher un cube en utilisant les vertex buffers. Mon code compile, mais à l'exécution rien ne s'affiche et le programme plante... Voici le code :

Code: Tout sélectionner
#include <iostream>
#include <windows.h>
#include <GL/glew.h>
#include <GL/freeglut.h>

#define BUFFER_OFFSET(bytes) ((GLubyte *) NULL + bytes)
#define VERTICES    0
#define INDICES     1
#define NUM_BUFFERS 2

void init(void)
{
   glEnable(GL_DEPTH_TEST);

   GLfloat vertices[][3] = {
      {-1.0, -1.0, -1.0},
      { 1.0, -1.0, -1.0},
      { 1.0,  1.0, -1.0},
      {-1.0,  1.0, -1.0},
      {-1.0, -1.0,  1.0},
      { 1.0, -1.0,  1.0},
      { 1.0,  1.0,  1.0},
      {-1.0,  1.0,  1.0}
   };

   GLubyte indices[][4] = {
      {0, 1, 2, 3},
      {4, 7, 6, 5},
      {0, 4, 5, 1},
      {3, 2, 6, 7},
      {0, 3, 7, 4},
      {1, 5, 6, 2}
   };

   GLuint buffers[NUM_BUFFERS];
   glGenBuffers(NUM_BUFFERS, buffers);

   glBindBuffer(GL_ARRAY_BUFFER, buffers[VERTICES]);
   glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
   glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));
   glEnableClientState(GL_VERTEX_ARRAY);

   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[INDICES]);
   glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
}

void display(void)
{
   glClearColor(0,0,0,0);
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   gluLookAt(4,3,3,0,0,0,0,1,0);

   glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
}

void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(45.0, (GLdouble) w/h, 1.0, 10.0);
}


int main(int argc, char **argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
   glutInitWindowPosition(0, 0);
   glutInitWindowSize(500, 500);
   glutCreateWindow(argv[0]);
   init();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutMainLoop();
   return 0;
}


Quelle est mon erreur? :00000017:
Avatar de l’utilisateur
MrPacane
Hello World, I'm new !
 
Messages: 49
Inscription: 20 Avr 2005, 03:21

Messagepar deathangel » 22 Avr 2010, 16:07

Idée toute simple (j'ai pas testé)

à la fin de ta fonction init, tes deux tableaux vertices et indices sont libérés, donc au moment du rendu il n'a plus accès aux coordonnées ?
c'est le truc qui me saute aux yeux, à moins que le glBindBuffer effectue une copie en mémoire de la CG, mais je ne m'avancerais pas, j'ai jamais vraiment utilisé les VBO...
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar valentin » 22 Avr 2010, 16:36

pas testé, mais manquerait pas "glewInit()" par hasard??

@ deathangel: ya effectivement une copie des points sur la carte graphique donc pas de soucis à ce niveau
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar MrPacane » 22 Avr 2010, 18:17

valentin a écrit:pas testé, mais manquerait pas "glewInit()" par hasard??


Effectivement, je n'avais pas initialisé GLEW... Voici le code à ajouter après la fonction glutCreateWindow() :

Code: Tout sélectionner
GLenum err = glewInit();
if (GLEW_OK != err)
{
   std::cout << "Erreur GLEW : " << glewGetErrorString(err);
}


Merci valentin!
Avatar de l’utilisateur
MrPacane
Hello World, I'm new !
 
Messages: 49
Inscription: 20 Avr 2005, 03:21


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron