【问题标题】:glGenVertexArrays causes a segmentation fault, how do I properly set up an OpenGL context? [closed]glGenVertexArrays 导致分段错误,如何正确设置 OpenGL 上下文? [关闭]
【发布时间】:2021-02-05 17:29:19
【问题描述】:

我正在尝试编写一个简单的三角形。但是 glGenVertexArrays(1, &VertexArrayID) 在我运行它时会导致分段错误。

SDL_Init(SDL_INIT_VIDEO);

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);

SDL_Window* window = SDL_CreateWindow("OpenGL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_OPENGL);
SDL_GLContext context = SDL_GL_CreateContext(window);

SDL_Event event;
SDL_bool quit = SDL_FALSE;

GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID); // This causes crash

我在这里找到了完全相同的东西 OpenGL Segfaults on glGenVertexArrays 但是

我忘记设置 OpenGL 上下文。现在都修好了。

没有帮助,因为我相信我已经创建了一个 OpenGL 上下文 SDL_GLContext context = SDL_GL_CreateContext(window);

如何正确设置 OpenGL 上下文?

【问题讨论】:

  • 您使用的是glew 还是glad?两者都必须初始化。
  • @Rabbid76 我正在使用 GLEW。我在代码开头添加了#define GLEW_STATIC
  • 所以你错过了glewInit

标签: c opengl glew opengl-3


【解决方案1】:

你必须Initialize GLEW。创建 OpenGL 上下文后立即调用glewInit

SDL_GLContext context = SDL_GL_CreateContext(window);

if (glewInit() != GLEW_OK)
{
    // error handling
    // [...]
}

注意,如果成功,glewInit 将返回 GLEW_OKglewInit 初始化 OpenGL 函数的函数指针。如果尝试通过未初始化的函数指针调用函数,则会发生分段错误。

【讨论】:

  • 谢谢。这绝对解释了我的问题。 glewInit() 实际上没有返回 GLEW_OK。所以我要去看看还有什么事情发生
  • @Simon 你的操作系统是什么?你绑定 glew 是静态的还是动态的?见GLEW - why should I define GLEW_STATIC?
  • 我使用的是 Ubuntu 20.04。我会假设是动态的,因为我是通过apt-get 安装它的。我也试过添加 glewExperimental=GL_TRUE; 也没有运气
  • glewInit() 之后设置SDL_GL_SetAttribute() 似乎解决了问题。
  • @Simon 不,它没有。在SDL_CreateWindow 之后调用SDL_GL_SetAttribute 没有任何效果。和不打电话SDL_GL_SetAttribute一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 2015-09-26
  • 2016-01-06
  • 2021-02-18
  • 1970-01-01
  • 2012-01-08
  • 2011-10-18
相关资源
最近更新 更多