최근에 OBJ 로더를 만들었습니다. 현재 VBO 버퍼 객체가 없어도 완벽하게 작동합니다. 현재 내 프로그램으로 VBO를 사용하는 것으로 변경하는 중입니다. 실행하려고 할 때마다 충돌 (응답하지 않음)됩니다.C++ OpenGL VBO 프로그램이 충돌 함
내 obj 로더는 법선과 verts를 그리는 것으로 구성되어 있으며, 그것은 또한 indicies 있습니다.
나는 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();
}
,536,
이것들은 내가 변경 한 유일한 두 함수입니다. 부호없는 int vbo와 vbo2를 외부에 정의했습니다.
실제 이유는 OP가 함수 포인터를 초기화하지 않기 때문입니다. VBO는 OpenGL-3에서만 확장되었습니다. 둘 중 하나를 초기화해야합니다. 또한 glVertexPointer는 VBO가 활성화 된 경우에도 포인터 인수에 임의의 정수 값을 사용합니다. 나는 보통 당신의 대답을 높은 품질이라고 생각하지만, 이번에는 당신이 빠져 있습니다. – datenwolf
@datenwolf glut가 그를 위해 함수 포인터를 초기화하지 않는 한 –
GLUT은 이것을하지 않습니다.OpenGLUT도 FreeGLUT도 아닙니다. FreeGLUT은 확장 기능이 지원되는지 테스트하기위한 명령과 '... GetProcAddress'를 둘러싼 휴대용 래퍼 (wrapper)를 포함하지만 실제로 포인터를로드하지는 않습니다. – datenwolf