Ошибка сегментации при попытке использовать SDL + GLEW - PullRequest
3 голосов
/ 17 октября 2011

Я пытаюсь узнать, как использовать SDL с OpenGL, используя GLEW для методов расширения. Насколько я могу судить по таким страницам, как Использование OpenGL с SDL из угла SDL следующий код должен работать

#include <glew.h>
#include <SDL.h>

#include <cstdlib>

int main(int argc, char *argv[]) {
    if (SDL_Init( SDL_INIT_EVERYTHING ) != 0) exit(EXIT_FAILURE);
    if (SDL_GL_LoadLibrary( NULL ) != 0) exit(EXIT_FAILURE);
    if (SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL) exit(EXIT_FAILURE);
    if (glewInit() != GLEW_OK) exit(EXIT_FAILURE);

    glViewport(0, 0, 640, 480);

    while (1) {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(50.0, 1.0, 0.1, 1000.0);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, 2.0, 0.0, 1.0, 0.0);

        glPolygonMode(GL_FRONT, GL_FILL);

        glBegin(GL_QUADS);
            glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
            glColor3f(1, 1, 0); glVertex3f(3, 0, 0);
            glColor3f(1, 0, 1); glVertex3f(3, 3, 0);
            glColor3f(1, 1, 1); glVertex3f(0, 3, 0);
        glEnd();

        SDL_GL_SwapBuffers();
    }

    SDL_Quit();
    return 0;
}

Однако при попытке вызова glViewport в строке 12 происходит ошибка. Это компилируется на OS X 10.7 с:

clang++ -g $(pkg-config --cflags sdl gl glu glew) -o test test.cpp $(pkg-config --libs sdl gl glu glew)

SDL - версия 1.2.14, а GLEW - версия 1.7.0.

1 Ответ

0 голосов
/ 28 октября 2013

Попробуйте поместить секции проекции и просмотра модели вне цикла while и glViewport после проекции:

#include <glew.h>
#include <SDL.h>

#include <cstdlib>

int main(int argc, char *argv[]) {
    if (SDL_Init( SDL_INIT_EVERYTHING ) != 0) exit(EXIT_FAILURE);
    if (SDL_GL_LoadLibrary( NULL ) != 0) exit(EXIT_FAILURE);
    if (SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL) exit(EXIT_FAILURE);
    if (glewInit() != GLEW_OK) exit(EXIT_FAILURE);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0, 0, 640, 480);
    gluPerspective(50.0, 1.0, 0.1, 1000.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, 2.0, 0.0, 1.0, 0.0);

    while (1) {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glPolygonMode(GL_FRONT, GL_FILL);

        glBegin(GL_QUADS);
            glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
            glColor3f(1, 1, 0); glVertex3f(3, 0, 0);
            glColor3f(1, 0, 1); glVertex3f(3, 3, 0);
            glColor3f(1, 1, 1); glVertex3f(0, 3, 0);
        glEnd();

        SDL_GL_SwapBuffers();
    }

    SDL_Quit();
    return 0;
}
...