2012-04-30 3 views
2

J'essaie de dessiner un cylindre en utilisant les VBO et je suis bloqué avec cette violation d'accès. Voici le code (formaté pour l'exemple):Exception non gérée/Accédez à l'emplacement de lecture de violation en essayant de dessiner un cylindre en utilisant VBO

int N; 
float *vertexArray, normalArray; 

void fillArrays(float height, float radius, int num) { 

N = num; 
vertexArray = (float*) malloc(sizeof(float)*36*num); 
normalArray = (float*) malloc(sizeof(float)*36*num); 
... 
} 

La fonction ci-dessus ne fait que remplir les tableaux avec les vecteurs et les sommets normaux.

void drawCylinder() { 
GLuint buffers[2]; 
glGenBuffers(2, buffers); 
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 
glBufferData(GL_ARRAY_BUFFER, 144*N, vertexArray, GL_STATIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER,buffers[1]); 
glBufferData(GL_ARRAY_BUFFER, 144*N, normalArray, GL_STATIC_DRAW); 

glVertexPointer(3,GL_FLOAT,0,vertexArray); 
glNormalPointer(GL_FLOAT,0,normalArray); 
glDrawArrays(GL_TRIANGLES, 0, 12*N); 
} 

L'exception est levée dans l'appel glDrawArrays. J'appelle drawCylinder() dans la fonction de rappel d'affichage de GLUT (renderfunc). La fonction principale ressemble à ceci:

void main(int argc, char **argv) { 

glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA); 
glutInitWindowPosition(100,100); 
glutInitWindowSize(320,320); 
glutCreateWindow("Glew - VBOs - Cylinder"); 

glutDisplayFunc(renderfunc); 
glutIdleFunc(renderfunc); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 

fillArrays(3,1,20); 
glutMainLoop(); 
} 

Il y a probablement plusieurs problèmes avec mon code, je viens juste de commencer à jouer avec VBOs (et avec les libs openGL pour cette question). Mais y a-t-il une raison évidente à cette exception? J'utilise Visual Studio, et comme je l'ai dit, la violation d'accès est apparemment détectée lors de l'appel de glDrawArrays.

Répondre

1
glVertexPointer(3,GL_FLOAT,0,vertexArray); 
glNormalPointer(GL_FLOAT,0,normalArray); 

Si vous utilisez VBOs l'argument gl*Pointer()pointer devrait être un décalage dans votre tampon, pas un pointeur natif. Les pointeurs natifs sont pour les tableaux de vertex. De plus, le fait de télécharger de nouveau vos données de vertex avant chaque appel de dessin annule quelque peu le but des VBO, en particulier avec l'indice GL_STATIC_DRAW.

This est un exemple VBO décent.

+0

Merci, je l'ai maintenant. Ce tutoriel était vraiment utile! –

0

En ce qui concerne la réponse de genpfault:

appelant drawCylinder() dans la fonction de rappel d'affichage de GLUT

Et à l'intérieur des drawCylinder vous créez/tampons bind? Par exemple, si vous créez une rotation interactive au clavier, chaque fois que vous appuyez sur une touche pour faire pivoter l'objet, un nouveau tampon sera lié. Finalement, la mémoire sera utilisée et peut-être provoquer un débordement de pile.

Vous pouvez créer un code d'initialisation de la mémoire tampon de lancer la fonction init() au init() et appeler avant votre glutDisplayFunc()

Questions connexes