我最近創建了一個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