C ++ openGL VBO崩溃程序

时间:2014-09-11 12:17:34

标签: c++ opengl

我最近创建了一个OBJ加载器,它目前工作得很好,没有任何VBO缓冲区对象。我目前正在使用我的程序转换为使用VBO,每次尝试运行它时都会崩溃(没有响应)。

我的obj加载器包括绘制法线和顶点,它还有标记。

我是openGL的新手,我对VBO的运作方式有所了解。

当我尝试向程序添加缓冲区时就是这样。

enter image description here

没有

enter image description here

这是我目前崩溃的代码

#define GLEW_STATIC
#include <GL/glew.h
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
int main(int argc,char** argv)
{
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(500, 500);

    glutCreateWindow("Object Loader!");
    setUpArrays();

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_COLOR_MATERIAL);


    glGenBuffers(1, &vbo);
    glGenBuffers(1, &vbo2);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo2);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glBufferData(GL_ARRAY_BUFFER, sizeof(normals), normals, GL_STATIC_DRAW);

    GLfloat posLight0[] = {0.0f, 0.0f, -1.0f, 0.0f};
    GLfloat lightColor[] = {1.0f, 1.0f, 1.0f, 1.0f};

    glLightfv(GL_LIGHT0, GL_POSITION, posLight0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);



    glutDisplayFunc(Draw);
    glutSpecialFunc(specialKeys);
    glutReshapeFunc(reshape);


    glutTimerFunc(25,update,0);

    glutMainLoop();
    return 0;
}

这是我的绘图功能

void Draw(void)
{
    glPushMatrix();
    glClearColor(0,0,0,1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glRotatef( rotate_x, 1.0, 0.0, 0.0 );
    glRotatef( rotate_y, 0.0, 1.0, 0.0 );


    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo2);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT,0, vertices);


    glEnableClientState(GL_NORMAL_ARRAY);
    glNormalPointer(GL_FLOAT, 0, normals);
    glColor3f(0.5f, 0.0f, 0.8f);

    glDrawElements(GL_TRIANGLES, amountOfFaces, GL_UNSIGNED_INT, faces);

    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, 0);


    glFlush();
    glutSwapBuffers();
    glPopMatrix();
}

这是我改变的唯一两个功能, 我在外面定义了unsigned int vbo和vbo2。

2 个答案:

答案 0 :(得分:2)

问题(以及崩溃的原因)是你的glVertexPointer应该有0作为偏移量,因为它相对于绑定缓冲区的开头。 (0是将程序存储器视为一个大缓冲区的特殊情况)

glGenBuffers(1, &vbo);
glGenBuffers(1, &vbo2);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, sizeof(normals), normals, GL_STATIC_DRAW);

这是另一个问题;第4行glBindBuffer完全覆盖之前对glBindBuffer的调用。或者更一般地说;仅使用了最后一次glBindBuffer调用,因此您实际上永远不会使用vbo

verticesnormals如何宣布?如果它们只是指针,那么你应该用sizeof(*vertices)*3*amountOfFaces

替换sizeof

答案 1 :(得分:0)

您的代码示例表明您尝试使用GLEW,但未在glewInit之后调用glutCreateWindow。你不能在没有首先加载地址的情况下使用OpenGL扩展功能 - 这正是GLEW所做的,如果你不想手动搞乱它(很可能你没有)。

即使在此之后您的代码似乎也是错误的,但它可能不会崩溃。当然不能没有完整的代码,但是

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo2);

没有意义 - 绑定一个缓冲区,然后立即绑定另一个缓冲区 - 为什么会这样?