SDL и буферы связывания

0

поэтому я пытался понять интерфейс SDL и приложить к нему свою программу OpenGL и freeglut - очистка ее от ссылок на перенасыщение. Наиболее проблематичная часть стала, когда я попытался подключить шейдеры - все было компиляцией, но я продолжаю получать ошибку ошибки сегментации. Очищенная версия программы:

#include <SDL2/SDL.h>
#include <GL/glew.h>
#include <GL/glu.h>
#include <iostream>

using namespace std;

int main(){

SDL_Window *window;
SDL_GLContext *context;
GLuint vao;

SDL_Init( SDL_INIT_VIDEO );
SDL_CreateWindow("cookie", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
512, 512, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
SDL_GL_CreateContext(window);
SDL_GL_SetSwapInterval(1);
cout<<"Hi! It my first instance"<<endl;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
cout<<"And it my second - i can't reach here"<<endl;
}

Я работаю над Ubuntu 14.04, Radeon 8somethingsmething card (если это действительно имеет значение). Команда, которую я использую для компиляции, такова:

g++ main.cpp -lGL -lGLEW -lSDL2

PS. Извините за новичку iostream, я начал программировать с c++.

  • 0
    Кстати, карта "Radeon 8somethingsomething" не будет поддерживать OpenGL 3.0 (откуда glGenVertexArrays ). Серия 9xxx технически не поддерживает все, что требуется GL 2.0.
Теги:
opengl
sdl

2 ответа

4

Вы никогда не назначаете значение для window. Когда SDL SDL_GL_CreateContext указатель, переданный в SDL_GL_CreateContext он сбой, потому что в window нет действительного значения указателя.

Обновление (фиксированный код)

int main(int argc, char *argv[])
{
    SDL_Init( SDL_INIT_VIDEO );

    SDL_Window * const window = SDL_CreateWindow(
       "cookie",
       SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
       512, 512,
       SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);        
    if( !window ) {
        cerr << "creating window failed" << endl;
        return 1;
    }

    SDL_GLContext * const context = SDL_GL_CreateContext(window);
    if( !context ) {
        cerr << "creating OpenGL context failed" << endl;
        return 1;
    }
/* ... */

Обновление 2

что @keltar написал здесь: qaru.site/questions/9233597/...

  • 0
    Нет, все еще ошибка сегментации. Но спасибо за совет.
  • 0
    @CheshireCat: Это не столько проверка ошибок, сколько создание окна, а затем ... вы освобождаете указатель на объект Window, созданный SDL. Переменная window никогда не видит действительное значение и то , что вы передаете в SDL_GL_CreateContext хуже , чем мусор. Вы вызываете неопределенное поведение языка, и компилятор будет иметь полное право создавать двоичный файл программы, который, например, при выполнении стирает что-либо с вашего жесткого диска, которое он может найти.
Показать ещё 1 комментарий
3

glGenVertexArrays - функция расширения. Вы включили glew.h, который обрабатывает расширения, но вы его не инициализировали. glewInit необходимо вызвать после создания GL-контекста (и проверить его возвращаемое значение).

Также немного советов - ошибка сегментации - это не какая-то странная магия, от которой вам следует бояться, и google, что, черт возьми, произошло. Он очень четко определен. Если вы запустите свою программу в отладчике, вы увидите, где именно она разбилась и почему (потому что glGenVertexArrays функция glGenVertexArrays, но значение этого указателя функции равно NULL). Если вы используете родной язык, такой как C, вы увидите это много, поэтому некоторое время, потраченное на изучение того, как использовать отладчик (если вы этого еще не знаете), сэкономит вам (и другим, заметьте) много времени позже.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню