我最近创建了一个OBJ加载器,它目前工作得很好,没有任何VBO缓冲区对象。我目前正在使用我的程序转换为使用VBO,每次尝试运行它时都会崩溃(没有响应)。
我的obj加载器包括绘制法线和顶点,它还有标记。
我是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。
答案 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
。
vertices
和normals
如何宣布?如果它们只是指针,那么你应该用sizeof(*vertices)*3*amountOfFaces
答案 1 :(得分:0)
您的代码示例表明您尝试使用GLEW,但未在glewInit
之后调用glutCreateWindow
。你不能在没有首先加载地址的情况下使用OpenGL扩展功能 - 这正是GLEW所做的,如果你不想手动搞乱它(很可能你没有)。
即使在此之后您的代码似乎也是错误的,但它可能不会崩溃。当然不能没有完整的代码,但是
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
没有意义 - 绑定一个缓冲区,然后立即绑定另一个缓冲区 - 为什么会这样?