【问题标题】:glBufferData not working outside main function [duplicate]glBufferData 在主函数之外不起作用[重复]
【发布时间】:2021-01-03 07:17:09
【问题描述】:

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

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

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

有什么想法吗?

// 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);

    }

【问题讨论】:

  • 当您看不到代码时,很难诊断代码问题。
  • 你使用类吗?你有没有想过OpenGL object in C++ RAII class no longer works
  • 我添加了一些代码和 cmets,以获得更好的想法。
  • @PocsanJr 您添加了有效的代码,为了解决您的问题,我们需要查看无效的代码
  • 就是这个想法,如果我这样保留它,它会起作用,如果我将关于 VBO 的那段代码移动到类的方法中,它就不起作用,这是唯一的变化。

标签: c++ opengl glfw glew


【解决方案1】:

问题出在sizeof(data)

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

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

【讨论】:

  • 谢谢!我不可能看到这一点,我一直认为这是窗口上下文的问题。傻我。
  • 这是一个常见的初学者错误,如果我一直在做,我可能已经从您的工作代码中猜到了问题,但请始终发布非工作代码。令人惊讶的是有多少海报不愿意这样做。
  • 是的,是的,现在我永远不会忘记这一点 :)) 我太确定问题与窗口上下文有关,所以当我调用这些 GL 函数时,它们会对当前窗口上下文没有影响。谢谢!!!我尝试调试了一个小时,差点放弃,把代码放到main函数中,尽管这样会让代码更乱。
猜你喜欢
  • 2017-11-15
  • 1970-01-01
  • 2016-06-08
  • 2015-02-26
  • 2021-06-25
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多