Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;openGL VBO崩溃程序_C++_Opengl - Fatal编程技术网

C++ C++;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 <

我最近创建了一个OBJ加载器,它目前运行得非常好,没有任何VBO缓冲区对象。我目前正在转换为在我的程序中使用VBO,每次我尝试运行它时它都会崩溃(没有响应)

我的obj加载器包括绘制法线和顶点,它也有标记

我是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;
}
这是我唯一改变的两个功能, 我已经在外部定义了无符号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);