Erreur de segmentation sur glGenVertexArrays (1, & vao);

Mon gdb backtrace donne:

(gdb) backtrace #0 0x00000000 in ?? () #1 0x0804a211 in init () at example1.cpp:147 #2 0x0804a6bc in main (argc=1, argv=0xbffff3d4) at example1.cpp:283 

Pas très informatif. Le débogueur d’Eclipse me laisse au moins voir qu’il s’arrête sur la ligne 3 ci-dessous:

 // Create a vertex array object GLuint vao; glGenVertexArrays( 1, &vao ); glBindVertexArray( vao ); 

C’est un bloc très courant à voir dans la programmation gl, et j’utilise même un autre code avec le même bloc sans problème. Donc je suis déconcerté.

Construire la sortie de make make:

 g++ -g -DFREEGLUT_STATIC -DGLEW_STATIC -I../../include example1.cpp ../../Commo/InitShader.o -L/usr/lib/mesa -lGLEW -lglut -lGL -lX11 -lm -o example1 

Programme contenant le problème:

 // rotating cube with two texture objects // change textures with 1 and 2 keys #include "Angel.h" const int NumTriangles = 12; // (6 faces)(2 sortingangles/face) const int NumVertices = 3 * NumTriangles; const int TextureSize = 64; typedef Angel::vec4 point4; typedef Angel::vec4 color4; // Texture objects and storage for texture image GLuint textures[2]; GLubyte image[TextureSize][TextureSize][3]; GLubyte image2[TextureSize][TextureSize][3]; // Vertex data arrays point4 points[NumVertices]; color4 quad_colors[NumVertices]; vec2 tex_coords[NumVertices]; // Array of rotation angles (in degrees) for each coordinate axis enum { Xaxis = 0, Yaxis = 1, Zaxis = 2, NumAxes = 3 }; int Axis = Xaxis; GLfloat Theta[NumAxes] = { 0.0, 0.0, 0.0 }; GLuint theta; //---------------------------------------------------------------------------- int Index = 0; void quad( int a, int b, int c, int d ) { point4 vertices[8] = { point4( -0.5, -0.5, 0.5, 1.0 ), point4( -0.5, 0.5, 0.5, 1.0 ), point4( 0.5, 0.5, 0.5, 1.0 ), point4( 0.5, -0.5, 0.5, 1.0 ), point4( -0.5, -0.5, -0.5, 1.0 ), point4( -0.5, 0.5, -0.5, 1.0 ), point4( 0.5, 0.5, -0.5, 1.0 ), point4( 0.5, -0.5, -0.5, 1.0 ) }; color4 colors[8] = { color4( 0.0, 0.0, 0.0, 1.0 ), // black color4( 1.0, 0.0, 0.0, 1.0 ), // red color4( 1.0, 1.0, 0.0, 1.0 ), // yellow color4( 0.0, 1.0, 0.0, 1.0 ), // green color4( 0.0, 0.0, 1.0, 1.0 ), // blue color4( 1.0, 0.0, 1.0, 1.0 ), // magenta color4( 0.0, 1.0, 1.0, 1.0 ), // white color4( 1.0, 1.0, 1.0, 1.0 ) // cyan }; quad_colors[Index] = colors[a]; points[Index] = vertices[a]; tex_coords[Index] = vec2( 0.0, 0.0 ); Index++; quad_colors[Index] = colors[a]; points[Index] = vertices[b]; tex_coords[Index] = vec2( 0.0, 1.0 ); Index++; quad_colors[Index] = colors[a]; points[Index] = vertices[c]; tex_coords[Index] = vec2( 1.0, 1.0 ); Index++; quad_colors[Index] = colors[a]; points[Index] = vertices[a]; tex_coords[Index] = vec2( 0.0, 0.0 ); Index++; quad_colors[Index] = colors[a]; points[Index] = vertices[c]; tex_coords[Index] = vec2( 1.0, 1.0 ); Index++; quad_colors[Index] = colors[a]; points[Index] = vertices[d]; tex_coords[Index] = vec2( 1.0, 0.0 ); Index++; } //---------------------------------------------------------------------------- void colorcube() { quad( 1, 0, 3, 2 ); quad( 2, 3, 7, 6 ); quad( 3, 0, 4, 7 ); quad( 6, 5, 1, 2 ); quad( 4, 5, 6, 7 ); quad( 5, 4, 0, 1 ); } //---------------------------------------------------------------------------- void init() { colorcube(); // Create a checkerboard pattern for ( int i = 0; i < 64; i++ ) { for ( int j = 0; j  360.0 ) { Theta[Axis] -= 360.0; } glutPostRedisplay(); } //---------------------------------------------------------------------------- void keyboard( unsigned char key, int mousex, int mousey ) { switch( key ) { case 033: // Escape Key case 'q': case 'Q': exit( EXIT_SUCCESS ); break; case '1': glBindTexture( GL_TEXTURE_2D, textures[0] ); break; case '2': glBindTexture( GL_TEXTURE_2D, textures[1] ); break; } glutPostRedisplay(); } //---------------------------------------------------------------------------- int main( int argc, char **argv ) { glutInit( &argc, argv ); glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH ); glutInitWindowSize( 512, 512 ); glutInitContextVersion( 3, 2 ); glutInitContextProfile( GLUT_CORE_PROFILE ); glutCreateWindow( "Color Cube" ); glewInit(); init(); glutDisplayFunc( display ); glutKeyboardFunc( keyboard ); glutMouseFunc( mouse ); glutIdleFunc( idle ); glutMainLoop(); return 0; } 

 glewExperimental = GL_TRUE; glewInit(); 

Devrait faire la magie


Pilotes Expérimentaux

GLEW obtient des informations sur les extensions sockets en charge à partir du pilote graphique. Toutefois, les pilotes expérimentaux ou pré-version peuvent ne pas signaler chaque extension disponible via le mécanisme standard, auquel cas GLEW le signalera non pris en charge. Pour contourner cette situation, le glewExperimental global glewExperimental peut être activé en le définissant sur GL_TRUE avant d’appeler glewInit() , ce qui garantit que toutes les extensions avec des points d’entrée valides seront exposées.

Fonctionne bien pour moi:

capture d'écran

 GL_VERSION : 4.1.10750 Compatibility Profile Context GL_VENDOR : ATI Technologies Inc. GL_RENDERER : AMD Radeon HD 6500 Series 

EDIT: J’utilise les dernières versions de FreeGLUT (2.8.0 RC2) et GLEW (1.7.0), ce qui peut faire la différence si vous utilisez des versions fournies par distro.

Avez-vous essayé des tests sur d’autres systèmes avec des cartes graphiques différentes? Si votre code répond à la spécification OpenGL et qu’il se bloque mystérieusement dans une fonction correctement appelée avec des parameters valides, cela pourrait bien être un bogue de pilote. S’il s’agit d’un bug de pilote, vous êtes réduit à la conjecture, apportez des modifications au fusil de chasse et développez progressivement une exaspération qu’une grande entreprise avec des milliards de dollars produise des excuses absolument nulles pour un pilote de carte graphique. Bonne chance!

Ubuntu 10.04, par exemple, est fourni avec glew 1.50, que glGenVertexArrays ne fonctionne pas sans le drapeau glewExperimental . il est donc dépendant de la version de glew