2014-09-11 187 views
-2

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

我的obj loader由绘制法线和垂直线组成,它也有标记。

我是新来的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

问题(和崩溃的原因)是你的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与sizeof(*vertices)*3*amountOfFaces

+0

真正的原因是,因为OP没有初始化函数指针。在此之前,VBOs已经被引入到核心,只有OpenGL-3才是其扩展。要么必须初始化。即使启用了VBOs,glVertexPointer也会为指针参数使用任意整数值。我通常认为你的答案质量很高,但是这次你太过分了。 – datenwolf 2014-09-11 13:31:34

+0

@datenwolf除非glut为他初始化函数指针 – 2014-09-11 13:40:03

+1

GLUT不会这样做。OpenGLUT和FreeGLUT都没有; FreeGLUT包含一个命令,用于测试是否支持扩展以及围绕'... GetProcAddress'的可移植包装器,但它实际上并未加载指针。 – datenwolf 2014-09-11 14:55:23

0

您的代码示例说明您正在尝试使用GLEW,但你glutCreateWindow后没有叫glewInit。如果你不想用手工弄乱它(很可能你没有),你不能使用OpenGL扩展函数,而不需要先加载他们的地址 - 这正是GLEW所做的。

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

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

不决策意识 - 绑定一个缓冲区,然后立即另一个 - 这是为什么?