0

使用缓冲区对象存储顶点数组时,我在 openGL 中遇到问题。当我运行代码时,会出现一个窗口,显示消息“访问冲突读取位置 0x000000000 ”,当我将光标移动到 glGenBuufers 函数旁边的箭头时,我看到了描述:这是该线程从当前函数返回时要执行的下一条语句

IDE 快照

代码:

int frame=0;
void display();
void datasource();

 GLuint vbo;

void datasource()
{
    GLfloat vertex1[]={-1.000000 ,0.500000 ,-0.700000 ,0.500000 ,-1.000000 ,0.800000 ,-0.700000 ,0.800000 ,-0.400000 ,0.500000 ,-0.100000 ,0.500000 ,-0.400000 ,0.800000 ,-0.100000 ,0.200000 ,0.500000 ,0.500000 ,0.500000 ,0.200000 ,0.800000 ,0.500000,0.800000 ,0.800000 ,0.800000 ,0.500000 ,1.100000 ,0.500000 ,0.800000 ,0.800000 ,1.100000,0.800000  };

    glGenBuffers(1,&vbo);
    glBindBuffer(GL_ARRAY_BUFFER,vbo);
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertex1),vertex1,GL_STATIC_DRAW);
}


void init(int arc,char **arch)
{
    glutInit(&arc,arch);
    glutInitWindowSize(800,800);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutCreateWindow("chess");
    glClearColor(0.0,0.0,0.0,0.0);
    glutDisplayFunc(display);
}

int main(int arc,char **arch)
{
    init(arc,arch);
    datasource();
    glutMainLoop();
    return 0;
}

void display()
{
    frame++;
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glDrawArrays(GL_TRIANGLE_STRIP,0,8);
    glutSwapBuffers();
    glutPostRedisplay();
}

我做错什么了?

4

2 回答 2

5

glGenBuffers、glBindBuffer 和 glBufferData 是顶点缓冲区对象扩展或 OpenGL-1.5 的函数。默认系统 ABI 仅适用于 OpenGL-1.2,因此您需要先加载扩展的 OpenGL 功能,然后才能使用它。仅包含标题是不够的,因为它们只是为您提供未初始化的符号。

最简单的方法:

  1. 从http://glew.sf.net下载并安装 GLEW
  2. 将所有出现的 替换#include <GL/gl.h>#include <GL/glew.h>
  3. 立即调用glewInit()glutCreateWindow检查错误代码
  4. 检查 VBO 是否可用(即至少 GL_ARB_vertex_buffer_object 或 OpenGL 版本 >= 1.5)
  5. 将 GLEW 库添加到您的链接器设置
于 2012-12-23T10:58:19.483 回答
2

函数指针本身 ( glGenBuffers) 可能是NULL( source )。这发生在 OpenGL 系统尚未正确初始化时,调用NULL函数指针显然会导致段错误。看看地址glGenBuffers,是NULL吗?如果是,那么你在初始化代码的某个地方犯了一个错误。

于 2012-12-23T09:41:38.097 回答