2014-09-11 3 views
-2

최근에 OBJ 로더를 만들었습니다. 현재 VBO 버퍼 객체가 없어도 완벽하게 작동합니다. 현재 내 프로그램으로 VBO를 사용하는 것으로 변경하는 중입니다. 실행하려고 할 때마다 충돌 (응답하지 않음)됩니다.C++ OpenGL VBO 프로그램이 충돌 함

내 obj 로더는 법선과 verts를 그리는 것으로 구성되어 있으며, 그것은 또한 indicies 있습니다.

나는 OpenGL에 익숙하지 않으며 VBO의 작동 방식에 대해 다소 알고있다.

내 프로그램에 버퍼를 추가하려고 시도한 것입니다.

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; 
} 

충돌 내 코드입니다

enter image description here

없이 인이 내 그리기 기능입니다

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(); 
} 
,536,

이것들은 내가 변경 한 유일한 두 함수입니다. 부호없는 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); 

다른 문제가 있습니다. 네 번째 줄 glBindBuffer은 이전 호출 인 glBindBuffer을 완전히 무시합니다. 또는 더 일반적으로; 마지막으로 glBindBuffer 호출 만 사용되므로 실제로는 vbo을 사용하지 않습니다.

또한 verticesnormals은 어떻게 선언됩니까? 포인터가 단지 포인터라면 sizeof를 sizeof(*vertices)*3*amountOfFaces으로 바꿔야합니다.

+0

실제 이유는 OP가 함수 포인터를 초기화하지 않기 때문입니다. VBO는 OpenGL-3에서만 확장되었습니다. 둘 중 하나를 초기화해야합니다. 또한 glVertexPointer는 VBO가 활성화 된 경우에도 포인터 인수에 임의의 정수 값을 사용합니다. 나는 보통 당신의 대답을 높은 품질이라고 생각하지만, 이번에는 당신이 빠져 있습니다. – datenwolf

+0

@datenwolf glut가 그를 위해 함수 포인터를 초기화하지 않는 한 –

+1

GLUT은 이것을하지 않습니다.OpenGLUT도 FreeGLUT도 아닙니다. FreeGLUT은 확장 기능이 지원되는지 테스트하기위한 명령과 '... GetProcAddress'를 둘러싼 휴대용 래퍼 (wrapper)를 포함하지만 실제로 포인터를로드하지는 않습니다. – datenwolf

0

코드 샘플은 GLEW를 사용하려하고 있지만 glutCreateWindow 이후에 glewInit을 호출하지 않았 음을 나타냅니다. 먼저 주소를로드하지 않고 OpenGL 확장 기능을 사용할 수 없습니다. 수동으로 처리하지 않으려는 경우 GLEW의 기능과 동일합니다.

그 후에도 코드가 잘못 표시되지만 충돌하지는 않을 것입니다. 물론 전체 코드없이 말할 수는 없지만,

버퍼를 바인드 한 다음 즉시 다른 버퍼를 사용하는 것이 좋습니다. 왜 그런가요?

관련 문제