OpenGL和SDL2 glGenBuffers分段错误

3

我在使用opengl和SDL2时遇到了问题。 当我想要触发glGenBuffers函数时,应用程序会崩溃。 有人知道我哪里出错了吗?

#define GLEW_STATIC
#include <iostream>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <GL/glew.h>

using namespace std;

SDL_Window*win;
SDL_Event event;
const Uint8*keystate = SDL_GetKeyboardState(NULL);

SDL_GLContext context;

int main(int argc, char*args[])
{
    SDL_Init(SDL_INIT_EVERYTHING);
    glewExperimental = GL_TRUE;
    glewInit();
    win = SDL_CreateWindow("opengl",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,900,800,SDL_WINDOW_OPENGL);
    context = SDL_GL_CreateContext(win);
    SDL_GL_MakeCurrent(win,context);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
    glClearColor( 1.0, 1.0, 1.0, 1.0 );

    float positions[6] =
    {
        -0.5f,-0.5f,
        0.0f,0.5f,
        0.5f,0.0f
    };
    GLuint buffer;
    glGenBuffers(1,&buffer); //here
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, 6,positions,GL_STATIC_DRAW);

    while(true)
    {
        while(SDL_PollEvent(&event))
        {
            if(event.type==SDL_QUIT) return 0;
        }
        glClear(GL_COLOR_BUFFER_BIT);
        glDrawArrays(GL_TRIANGLES,0,3);
        SDL_GL_SwapWindow(win);
    }
}

我真的不知道问题出在哪里,如果有人能帮助我,我会非常感激。

1个回答

4

在OpenGL上下文通过SDL_GL_MakeCurrent(win,context)成为当前上下文后,必须通过glewInit初始化GLEW库。请参阅初始化GLEW

win = SDL_CreateWindow("opengl",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,
                       900,800,SDL_WINDOW_OPENGL);
context = SDL_GL_CreateContext(win);
SDL_GL_MakeCurrent(win,context);

if (glewInit() != GLEW_OK)
    return 0;

如果您之前这样做,glew的初始化会失败,glewInit不会返回GLEW_OK


这个问题已经被纠正了,但是仍然没有解决 glGenBuffers() 的问题。 - Mysz nocny
@Mysznocny 你是在SDL_GL_MakeCurrent之后只调用一次glewInit吗?还是调用两次? - Rabbid76
一旦执行了SDL_GL_MakeCurrent函数 - Mysz nocny
1
现在没问题了!我没有在编译中添加-no-pie选项。 - Mysz nocny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接