Opengl GLEW-Glgen故障

Opengl GLEW-Glgen故障,opengl,segmentation-fault,sdl,glew,Opengl,Segmentation Fault,Sdl,Glew,我正在尝试使用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] = {

我正在尝试使用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;
}
#包括
#包括
#包括
#包括
#包括
GLuint*SetupCubeBuffers(无效)
{
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
};
胶合指数缓冲[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_数组_BUFFER,buffers[0]);
glBufferData(GL_数组_缓冲区、sizeof(vertexBuffer)、vertexBuffer、GL_静态_绘图);
glBindBuffer(GL_元素_数组_BUFFER,buffers[1]);
glBufferData(GL_元素数组缓冲区、sizeof(indexBuffer)、indexBuffer、GL_静态图);
返回缓冲区;
}
无效的DrawBuffers(GLuint*缓冲区)
{
glBindBuffer(GL_数组_BUFFER,buffers[0]);
glVertexPointer(3,GL_FLOAT,6*sizeof(FLOAT),(FLOAT*)NULL+3);
glColorPointer(3,GL_浮点,6*sizeof(浮点),0);
glBindBuffer(GL_元素_数组_BUFFER,buffers[1]);
glEnableClientState(GL_顶点_数组);
glEnableClientState(GL_颜色_阵列);
GLD元素(GLU三角形,36,GLU无符号整数,0);
glDisableClientState(GL_颜色_数组);
glDisableClientState(GL_顶点_数组);
}
int main(int argc,字符**argv)
{
int-wndHold=1;
SDL_事件e;
SDL_窗口*屏幕;
SDL_glcon;
glewStatus盂;
GLuint*缓冲区;
if(SDL_Init(SDL_Init_视频)<0)
{
fprintf(stderr,“错误:%s\n\n”,SDL_GetError());
}
screen=SDL_CreateWindow(“测试”,
SDL_窗口位置居中,
SDL_窗口位置居中,
640, 480,
SDL_窗口_OPENGL);
con=SDL\u GL\u CreateContext(屏幕);
glewStatus=glewInit();
如果(glewStatus!=GLEW_OK)
{
printf(“错误:%s\n\n”,glewGetErrorString(glewStatus));
}
SDL_GL_SetSwapInterval(1);
glClearColor(0.0,0.0,0.0,1.0);
缓冲区=SetupCubeBuffers();
while(wndHold)
{
glClear(GLU颜色缓冲位);
缓冲器(缓冲器);
SDL_GL_SwapWindow(屏幕);
SDL_WaitEvent&e;
如果(e.type==SDL\u退出)
{
wndHold=0;
}
}
SDL_GL_DeleteContext(con);
SDL_窗口(屏幕);
SDL_退出();
返回0;
}
但是,当我执行程序时,出现“test.exe已停止工作”错误。 在调试模式下,当我调用glGenBuffers时,我可以看到有一个segfault。然而,glewInit()是在初始化GL上下文之后调用的,所以我看不出这里出了什么问题


我使用的是Windows 8,我使用的是SDL 2.0,您的glGenBuffers函数试图写入NULL,因此出现了segfault。 在尝试写入阵列之前,需要先初始化阵列:

GLuint *buffers = new GLuint[2];

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