首页 > 解决方案 > glBufferData 在主函数之外不起作用

问题描述

我有一个问题,我不知道如何解决。我将 C++ 与 GLEW 和 GLFW 一起使用,我初始化 GLFW,创建窗口,使窗口成为当前上下文,然后初始化 GLEW。所有这些都发生在 main 函数上。

当创建VAO和VBO的代码以方法组织时出现问题,在类中,我看到生成了VAO,生成了VBO,但是当使用glBufferData将数据发送到GPU时,它确实不行。如果我把这段代码移到主函数中,一切正常,但在它之外,它就不起作用了。

这段代码在主函数上完美运行,但如果我将它移到其他函数中,只是为了让事情更清楚,它就会停止工作。所以我认为这个问题在某种程度上与那个背景有关。我在主函数上创建窗口,即当前上下文。

任何想法?

// MAIN FUNCTION

unsigned int vaoID;
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);

// if I move this code in a method of a class and pass the vao, to bind it again //there it does not work
// if I leave it here, like this, it works
unsigned int vboID;
unsigned int attribPointer = 0;
glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(attribPointer, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

// the drawing part, just the idea, it's in a while, of course.
glBindVertexArray(vaoID);
glEnableVertexAttribArray(attribPointer);
glDrawArrays(GL_TRIANGLES, 0, 6);

glDisableVertexAttribArray(attribPointer);
glBindVertexArray(0);
//if I move it here, it's dead
void storeDataInAttributeList(int attributeNumber, float data[], int vaoID)
    {
        glBindVertexArray(vaoID);
        unsigned int vboID;
        glGenBuffers(1, &vboID);
        vbos.push_back(vboID);
        glBindBuffer(GL_ARRAY_BUFFER, vboID);
        glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
        glVertexAttribPointer(attributeNumber, 3, GL_FLOAT, GL_FALSE, 0, 0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);

    }

标签: c++openglglfwglew

解决方案


问题就在这里sizeof(data)

在您的方法data中有一个指针,并sizeof(data)返回指针的大小,而不是原始数组的大小。

要解决将大小作为参数与数据一起传递给方法的问题。或者使用 astd::vector<float>而不是浮点数组。


推荐阅读