我最近创建了一个OBJ加载器,它现在工作得很好,没有任何VBO缓冲区对象。我目前正在更换使用VBO和我的程序,每当我尝试运行它时,它都会崩溃(不响应)。C++ openGL VBO崩溃程序
我的obj loader由绘制法线和垂直线组成,它也有标记。
我是新来的openGL,我对VBO是如何工作有点了解。
这是当我试图添加缓冲区到我的程序。
这是它没有
这是我的代码,目前正在崩溃
#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外部。
真正的原因是,因为OP没有初始化函数指针。在此之前,VBOs已经被引入到核心,只有OpenGL-3才是其扩展。要么必须初始化。即使启用了VBOs,glVertexPointer也会为指针参数使用任意整数值。我通常认为你的答案质量很高,但是这次你太过分了。 – datenwolf 2014-09-11 13:31:34
@datenwolf除非glut为他初始化函数指针 – 2014-09-11 13:40:03
GLUT不会这样做。OpenGLUT和FreeGLUT都没有; FreeGLUT包含一个命令,用于测试是否支持扩展以及围绕'... GetProcAddress'的可移植包装器,但它实际上并未加载指针。 – datenwolf 2014-09-11 14:55:23