GLEW glGenBuffers 段错误

Posted

技术标签:

【中文标题】GLEW glGenBuffers 段错误【英文标题】:GLEW glGenBuffers segfault 【发布时间】:2014-01-26 15:34:39 【问题描述】:

我正在尝试通过以下代码将 OpenGL 与 SDL 一起使用:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <SDL2/SDL.h>
#include <GL/glew.h>

GLuint* SetupCubeBuffers(void)

    GLuint *buffers = NULL;

    GLfloat vertexBuffer[48] = 
        1.0, 0.0, 0.0, -1.0, 1.0, -1.0,
        1.0, 0.0, 1.0, -1.0, -1.0, -1.0,
        1.0, 1.0, 1.0, -1.0, 1.0, 1.0,
        0.0, 0.0, 1.0, -1.0, -1.0, 1.0,
        0.0, 1.0, 0.0, 1.0, 1.0, 1.0,
        0.0, 1.0, 1.0, 1.0, -1.0, 1.0,
        1.0, 1.0, 0.0, 1.0, 1.0, -1.0,
        1.0, 1.0, 1.0, 1.0, -1.0, -1.0
    ;

    GLuint indexBuffer[36] = 
        0, 1, 2, 2, 1, 3,
        4, 5, 6, 6, 5, 7,
        3, 1, 5, 5, 1, 7,
        0, 2, 6, 6, 2, 4,
        6, 7, 0, 0, 7, 1,
        2, 3, 4, 4, 3, 5
    ;

    glGenBuffers(2, buffers);

    glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexBuffer), vertexBuffer, GL_STATIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexBuffer), indexBuffer, GL_STATIC_DRAW);

    return buffers;


void DrawBuffers(GLuint* buffers)

    glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
    glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), (float*)NULL + 3);
    glColorPointer(3, GL_FLOAT, 6 * sizeof(float), 0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);

    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);

    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);


int main(int argc, char** argv)

    int wndHold = 1;
    SDL_Event e;
    SDL_Window *screen;
    SDL_GLContext con;
    GLenum glewStatus;
    GLuint* buffers;

    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    
        fprintf(stderr, "Error: %s\n\n", SDL_GetError());
    

    screen = SDL_CreateWindow("test",
                              SDL_WINDOWPOS_CENTERED,
                              SDL_WINDOWPOS_CENTERED,
                              640, 480,
                              SDL_WINDOW_OPENGL);

    con = SDL_GL_CreateContext(screen);
    glewStatus = glewInit();

    if (glewStatus != GLEW_OK)
    
        printf("Error: %s\n\n", glewGetErrorString(glewStatus));
    

    SDL_GL_SetSwapInterval(1);

    glClearColor(0.0, 0.0, 0.0, 1.0);

    buffers = SetupCubeBuffers();

    while (wndHold)
    
        glClear(GL_COLOR_BUFFER_BIT);

        DrawBuffers(buffers);

        SDL_GL_SwapWindow(screen);

        SDL_WaitEvent(&e);

        if (e.type == SDL_QUIT)
        
            wndHold = 0;
        
    

    SDL_GL_DeleteContext(con);
    SDL_DestroyWindow(screen);
    SDL_Quit();

    return 0;

但我在执行程序时收到“test.exe 已停止工作”错误。 在调试模式下,我可以看到调用 glGenBuffers 时出现了段错误。但是,glewInit() 是在初始化 GL 上下文后立即调用的,所以我看不出这里有什么问题?

我在 Windows 8 上,我正在使用 SDL 2.0

【问题讨论】:

【参考方案1】:

您的 glGenBuffers 函数正在尝试写入 NULL,因此出现了段错误。 您需要先初始化您的数组,然后再尝试对其进行任何写入:

GLuint *buffers = new GLuint[2];

【讨论】:

另外,我会注意到让函数以这种方式分配内存是一个非常糟糕的主意。这是等待发生的内存泄漏。 顺便说一下,你可以只写 GLuint 缓冲区[2];如果您害怕泄漏 2*sizeof(GLuint) 字节,请使用堆栈内存。 是的,但您还必须确保不要在函数中创建数组。在函数中创建的变量只能保证在该函数的范围内持续存在。 谢谢大家!!

以上是关于GLEW glGenBuffers 段错误的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL程序给出一个段错误

从 DLL 链接到 OpenGL:运行时 glew 函数为空

GLEW + VS2010 错误

GLEW 链接器错误

构建成功,但尝试运行程序时出现 GLEW 错误

GLEW 链接错误 [重复]