2014-09-11 183 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); 

不決策意識 - 綁定一個緩衝區,然後立即另一個 - 這是爲什麼?