0

I got linked opengl32, glew32 and glfw3. Everything is fine till run app. I inited glfw 1st, next I created context and inited glew. There's no error. Problem shows only when I'm trying to use OpenGL 3.2 functions like glBindBuffer, I got segmentation fault, but address is setted, can anybody help me?

// *** ADDED BY HEADER FIXUP *** #include <cstdio> #include <cstdlib> #include <iostream> // *** END *** #include <GLFW/glfw3.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> ////////////////////////////////////////////////////////////////////// // (c) Janusz Ganczarski // http://www.januszg.hg.pl // [email protected] ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // identyfikator obiektu programu ////////////////////////////////////////////////////////////////////// GLuint program; ////////////////////////////////////////////////////////////////////// // identyfikator obiektu bufora z danymi tablicy // wierzchołków - współrzędnymi wierzchołków kwadratu ////////////////////////////////////////////////////////////////////// GLuint vertexBuffer; ////////////////////////////////////////////////////////////////////// // identyfikator obiektu tablic wierzchołków ////////////////////////////////////////////////////////////////////// GLuint vertexArray; ////////////////////////////////////////////////////////////////////// // współrzędne wierzchołków trójkątów składających się na kwadrat ////////////////////////////////////////////////////////////////////// GLfloat position[2 * 3 * 2] = { -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f }; ////////////////////////////////////////////////////////////////////// // funkcja generująca scenę 3D ////////////////////////////////////////////////////////////////////// void DisplayScene() { // czyszczenie bufora koloru glClear ( GL_COLOR_BUFFER_BIT ); // włączenie obiektu tablic wierzchołków glBindVertexArray ( vertexArray ); // włączenie shadera //glUseProgram( program ); // narysowanie danych zawartych w tablicach wierzchołków glDrawArrays ( GL_TRIANGLES, 0, 2 * 3 ); // wyłączenie shadera glUseProgram ( 0 ); // wyłączenie obiektu tablic wierzchołków glBindVertexArray ( 0 ); } ////////////////////////////////////////////////////////////////////// // zmiana wielkości okna ////////////////////////////////////////////////////////////////////// void Reshape ( int width, int height ) { // obszar renderingu - całe okno glViewport ( 0, 0, width, height ); } ////////////////////////////////////////////////////////////////////// // inicjalizacja stałych elementów maszyny stanu OpenGL ////////////////////////////////////////////////////////////////////// void InitScene() { // kolor tła - zawartość bufora koloru glClearColor ( 1.0f, 1.0f, 1.0f, 1.0f ); // wczytanie shaderów i przygotowanie obsługi programu //AttachVertexShader( program, "kwadrat_vs.glsl" ); //AttachFragmentShader( program, "kwadrat_fs.glsl" ); // konsolidacja programu //LinkProgram( program ); // generowania identyfikatora obiektu tablic wierzchołków glGenVertexArrays ( 1, &vertexArray ); // utworzenie obiektu tablic wierzchołków glBindVertexArray ( vertexArray ); // generowanie identyfikatora obiektu bufora glGenBuffers ( 1, &vertexBuffer ); // utworzenie obiektu bufora wierzchołków (VBO) glBindBuffer ( GL_ARRAY_BUFFER, vertexBuffer ); // załadowanie danych obiektu bufora wierzchołków glBufferData ( GL_ARRAY_BUFFER, sizeof ( position ), position, GL_STATIC_DRAW ); // pobranie indeksu atrybutu wierzchołka o nazwie "inPosition" // GLuint positionLoc = glGetAttribLocation( program, "inPosition" ); // zdefiniowanie tablicy wierzchołków // glVertexAttribPointer( positionLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL ); // włączenie tablic wierzchołków // glEnableVertexAttribArray( positionLoc ); // wyłączenie obiektu tablic wierzchołków glBindVertexArray ( 0 ); } ////////////////////////////////////////////////////////////////////// // usunięcie obiektów OpenGL ////////////////////////////////////////////////////////////////////// void DeleteScene() { // usunięcie obiektu programu glDeleteProgram ( program ); // usunięcie obiektu bufora wierzchołków glDeleteBuffers ( 1, &vertexBuffer ); // usunięcie obiektu tablic wierzchołków glDeleteVertexArrays ( 1, &vertexArray ); } static void error_callback ( int error, const char* description ) { fputs ( description, stderr ); } static void key_callback ( GLFWwindow* window, int key, int scancode, int action, int mods ) { if ( key == GLFW_KEY_ESCAPE && action == GLFW_PRESS ) { glfwSetWindowShouldClose ( window, GL_TRUE ); } } int main ( void ) { GLFWwindow* window; glfwSetErrorCallback ( error_callback ); if ( !glfwInit() ) { exit ( EXIT_FAILURE ); } glfwWindowHint ( GLFW_CONTEXT_VERSION_MAJOR, 3 ); glfwWindowHint ( GLFW_CONTEXT_VERSION_MINOR, 2 ); glfwWindowHint ( GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE ); glfwWindowHint ( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE ); window = glfwCreateWindow ( 800, 600, "Simple example", NULL, NULL ); if ( !window ) { glfwTerminate(); exit ( EXIT_FAILURE ); } glfwMakeContextCurrent ( window ); GLenum err = glewInit(); if ( GLEW_OK != err ) { exit ( 1 ); } glfwSetKeyCallback ( window, key_callback ); InitScene(); while ( !glfwWindowShouldClose ( window ) ) { int width, height; glfwGetFramebufferSize ( window, &width, &height ); DisplayScene(); glfwSwapBuffers ( window ); glfwPollEvents(); } glfwDestroyWindow ( window ); glfwTerminate(); exit ( EXIT_SUCCESS ); } 
3
  • Where's the seg fault happening? Can you remove as much code as possible and still reproduce the problem? Having a minimal example (Without the foreign language comments preferably) will help us help you! Commented Jul 29, 2013 at 15:58
  • when app uses any 3.2 functions, like glBindBuffer, glBindVertexArray, etc.. Commented Jul 29, 2013 at 16:02
  • 1
    You don't seem to be including glew.h before the GLFW header as specified in their FAQ (glfw.org/faq.html#215__can_i_use_glew_with_glfw). I'm actually surprised your code compiles since you call GLEW function without having the header included... Commented Jul 29, 2013 at 16:08

1 Answer 1

2

Try doing

glewExperimental = GL_TRUE; 

before you call glewInit(). Otherwise, it will crash when you draw from vertex arrays.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.