поэтому я пытался понять интерфейс 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++.
Вы никогда не назначаете значение для 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;
}
/* ... */
что @keltar написал здесь: qaru.site/questions/9233597/...
window
никогда не видит действительное значение и то , что вы передаете в SDL_GL_CreateContext
хуже , чем мусор. Вы вызываете неопределенное поведение языка, и компилятор будет иметь полное право создавать двоичный файл программы, который, например, при выполнении стирает что-либо с вашего жесткого диска, которое он может найти.
glGenVertexArrays
- функция расширения. Вы включили glew.h
, который обрабатывает расширения, но вы его не инициализировали. glewInit
необходимо вызвать после создания GL-контекста (и проверить его возвращаемое значение).
Также немного советов - ошибка сегментации - это не какая-то странная магия, от которой вам следует бояться, и google, что, черт возьми, произошло. Он очень четко определен. Если вы запустите свою программу в отладчике, вы увидите, где именно она разбилась и почему (потому что glGenVertexArrays
функция glGenVertexArrays
, но значение этого указателя функции равно NULL). Если вы используете родной язык, такой как C, вы увидите это много, поэтому некоторое время, потраченное на изучение того, как использовать отладчик (если вы этого еще не знаете), сэкономит вам (и другим, заметьте) много времени позже.
glGenVertexArrays
). Серия 9xxx технически не поддерживает все, что требуется GL 2.0.