Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C glGenBuffers在GLEW中为空?_C_Opengl_Sdl 2_Glew - Fatal编程技术网

C glGenBuffers在GLEW中为空?

C glGenBuffers在GLEW中为空?,c,opengl,sdl-2,glew,C,Opengl,Sdl 2,Glew,我用OpenGL、SDL2和GLEW编写了一个简单的程序。它可以在Linux、Wine和我运行它的一个Windows7系统上正常工作。然而,在另一个Windows系统上,它一进入glGenBuffers就会崩溃,尽管它说OpenGL2.1是可用的。代码如下: #define GLEW_STATIC #include <stdio.h> #include <GL/glew.h> #include <SDL2/SDL.h> SDL_Window *window

我用OpenGL、SDL2和GLEW编写了一个简单的程序。它可以在Linux、Wine和我运行它的一个Windows7系统上正常工作。然而,在另一个Windows系统上,它一进入glGenBuffers就会崩溃,尽管它说OpenGL2.1是可用的。代码如下:

#define GLEW_STATIC

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

SDL_Window *window;
SDL_GLContext context;

GLuint vbo;

void Init() {
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_GL_LoadLibrary(NULL);
    int min, max;
    SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,&max);
    SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,&min);
    printf("Default OpenGL version %d.%d\n",max,min);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,2);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,1);
    SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,&max);
    SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,&min);
    printf("OpenGL version %d.%d\n",max,min);
    SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL,1);
    window=SDL_CreateWindow("", 0, 0, 500, 500, SDL_WINDOW_OPENGL);
    context = SDL_GL_CreateContext(window);
    glewExperimental=1;
    GLenum err=glewInit();
    if(GLEW_OK!=err)
    {
        printf("Error: %s\n", glewGetErrorString(err));
        return(1);
    }

    if(window==NULL) {
        printf("Could not create window: %s\n", SDL_GetError());
        return(1);
    }
    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    glShadeModel(GL_FLAT);
    glEnableClientState(GL_VERTEX_ARRAY);
    float data[][2] = {{50,50},{100,50},{75,100}};
    glGenBuffers(1,&vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
}

void Render() {
    glViewport(0,0, (GLsizei) 500, (GLsizei) 500);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0f, (GLdouble) 500, 0.0f, (GLdouble) 500);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0f,0.0f,0.0f);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glVertexPointer(2, GL_FLOAT, 2*sizeof(float), 0);
    glDrawArrays(GL_TRIANGLES,0,3);
    SDL_GL_SwapWindow(window);
}

int main(int argc, char **argv){
    Init();
    Render();
    SDL_Delay(2000);
    glDeleteBuffers(1,&vbo);
    return(0);
}
#定义GLEW#U静态
#包括
#包括
#包括
SDL_窗口*窗口;
语境;
GLuint vbo;
void Init(){
SDL_Init(SDL_Init_EVERYTHING);
SDL_GL_加载库(空);
最小整数,最大整数;
SDL\u GL\u GetAttribute(SDL\u GL\u上下文\u主要版本和最大值);
SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,&min);
printf(“默认OpenGL版本%d.%d\n”,最大值,最小值);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,1);
SDL\u GL\u GetAttribute(SDL\u GL\u上下文\u主要版本和最大值);
SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,&min);
printf(“OpenGL版本%d.%d\n”,最大值,最小值);
SDL_GL_SetAttribute(SDL_GL_视觉加速,1);
window=SDL_CreateWindow(“、0、0、500、500,SDL_window\u OPENGL”);
context=SDL\u GL\u CreateContext(窗口);
glewExperimental=1;
GLenum err=glewInit();
如果(GLEW_OK!=错误)
{
printf(“错误:%s\n”,glewGetErrorString(err));
申报表(1);
}
如果(窗口==NULL){
printf(“无法创建窗口:%s\n”,SDL_GetError());
申报表(1);
}
glClearColor(1.0f、1.0f、1.0f、0.0f);
glShadeModel(GLU平面);
glEnableClientState(GL_顶点_数组);
浮点数据[][2]={{50,50},{100,50},{75100};
glGenBuffers(1,&vbo);
glBindBuffer(GL_数组_BUFFER,vbo);
glBufferData(GLU数组缓冲区、大小(数据)、数据、GLU静态图);
}
void Render(){
glViewport(0,0,(GLsizei)500,(GLsizei)500);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0f,(GLdouble)500,0.0f,(GLdouble)500);
glClear(GLU颜色缓冲位);
GL3F(0.0f,0.0f,0.0f);
glBindBuffer(GL_数组_BUFFER,vbo);
glvertexointer(2,GL_FLOAT,2*sizeof(FLOAT),0);
GLDRAW阵列(GLU三角形,0,3);
SDL_GL_SwapWindow(窗口);
}
int main(int argc,字符**argv){
Init();
Render();
SDL_延迟(2000年);
glDeleteBuffers(1和vbo);
返回(0);
}
以下是我在最初发布此问题后添加的更多信息:

  • 使用%p打印glBindBuffer的地址,它是0
  • (GLEW_ARB_vertex_buffer_object==GL_TRUE)和(GLEW_ARB_vertex_array_object==GL_TRUE)都返回0
  • glGetString(GL_渲染器)返回“GDI通用”
  • 我还尝试将深度大小设置为16,但仍然不起作用
  • 图形卡是Nvidia 750 TI

如果您摆脱了glEnableClientState(GL\u VERTEX\u数组),该怎么办;电话线?还是坏掉了。此页面上的两个示例都不起作用(),第二个示例根本不使用glEnableClientState。还有其他建议吗?谢谢我已经用更多的信息更新了这个问题。你确定一切都符合你的背景吗?这样的smth可能会有所帮助:如果去掉glEnableClientState(GL_VERTEX_数组),该怎么办;电话线?还是坏掉了。此页面上的两个示例都不起作用(),第二个示例根本不使用glEnableClientState。还有其他建议吗?谢谢我已经用更多的信息更新了这个问题。你确定一切都符合你的背景吗?这样的smth可能会有所帮助:如果去掉glEnableClientState(GL_VERTEX_数组),该怎么办;电话线?还是坏掉了。此页面上的两个示例都不起作用(),第二个示例根本不使用glEnableClientState。还有其他建议吗?谢谢我已经用更多的信息更新了这个问题。你确定一切都符合你的背景吗?这样的smth可能有帮助: