C++ C++;openGL VBO崩溃程序
我最近创建了一个OBJ加载器,它目前运行得非常好,没有任何VBO缓冲区对象。我目前正在转换为在我的程序中使用VBO,每次我尝试运行它时它都会崩溃(没有响应) 我的obj加载器包括绘制法线和顶点,它也有标记 我是openGL新手,对VBO的工作原理有些了解 当我尝试向程序中添加缓冲区时就是这样 这是它没有 这是我目前正在崩溃的代码C++ C++;openGL VBO崩溃程序,c++,opengl,C++,Opengl,我最近创建了一个OBJ加载器,它目前运行得非常好,没有任何VBO缓冲区对象。我目前正在转换为在我的程序中使用VBO,每次我尝试运行它时它都会崩溃(没有响应) 我的obj加载器包括绘制法线和顶点,它也有标记 我是openGL新手,对VBO的工作原理有些了解 当我尝试向程序中添加缓冲区时就是这样 这是它没有 这是我目前正在崩溃的代码 #define GLEW_STATIC #include <GL/glew.h #include <GL/glut.h> #include <
#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;
}
这是我唯一改变的两个功能,
我已经在外部定义了无符号int vbo和vbo2。问题(以及崩溃的原因)是您的glvertexpinter
应该有0作为偏移量,因为它相对于绑定缓冲区的开始。(0是将程序内存视为一个大缓冲区的特殊情况)
这是另一个问题;第四行glBindBuffer
完全覆盖先前对glBindBuffer
的调用。或者更一般地说;只使用最后一个glBindBuffer
调用,因此您永远不会实际使用vbo
另外,
顶点
和法线
是如何声明的?如果它们只是指针,那么您应该用sizeof(*顶点)*3*amountOffices
您的代码示例表明您正在尝试使用GLEW,但在glutCreateWindow
之后您还没有调用glewInit
。如果您不想手动处理OpenGL扩展函数(很可能您不想),那么您不能在不首先加载它们的地址的情况下使用OpenGL扩展函数——这正是GLEW所做的
即使在那之后,您的代码似乎还是错误的,但它可能不会崩溃。当然,如果没有完整的代码就不能说,但是
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
没有意义-绑定一个缓冲区,然后立即绑定另一个缓冲区-为什么会这样?真正的原因是,因为OP没有初始化函数指针。VBOs仅通过OpenGL-3引入核心,在此之前,它是一个扩展。任何一个都必须初始化。此外,即使启用了VBOs,glVertexPointer也会为指针参数获取任意整数值。我通常认为你的答案是高质量的,但是这一次,你是不可能的。@除非Enter初始化GHULGUT的函数指针,否则DATEWORKEW不会这样做。OpenGLUT和FreeGLUT都没有;FreeGLUT包含一个用于测试扩展是否受支持的命令和一个围绕
…GetProcAddress
的可移植包装器,但它实际上并没有加载指针。嘿,伙计们,我不太确定函数指针是什么,如果你们能详细说明,我将不胜感激。干杯
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(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo2);