2013-07-29 2 views
0

У меня связаны opengl32, glew32 и glfw3. Все в порядке до запуска приложения. I inited glfw 1-й, следующий я создал контекст и занесенный glew. Ошибок нет. Проблема показывается только тогда, когда я пытаюсь использовать функции OpenGL 3.2, такие как glBindBuffer, я получил ошибку сегментации, но адрес настроен, может кто-нибудь мне помочь?GLFW3 & GLEW Ошибка сегментации

// *** 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); 
} 
+0

Опубликуйте некоторый код, особенно если произошла ошибка seg. –

+0

@pwny добавленный код извините за комментарии – UnknownError1337

+0

Где происходит ошибка seg? Можете ли вы удалить как можно больше кода и все еще воспроизвести проблему? Наличие минимального примера (без комментариев на иностранном языке) поможет нам помочь! –

ответ

2

Попробуйте сделать

glewExperimental = GL_TRUE; 

перед вызовом glewInit(). В противном случае он будет сбой при рисовании из вершинных массивов.

Смежные вопросы