c++ - 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);
}
解决方案
问题就在这里sizeof(data)
。
在您的方法data
中有一个指针,并sizeof(data)
返回指针的大小,而不是原始数组的大小。
要解决将大小作为参数与数据一起传递给方法的问题。或者使用 astd::vector<float>
而不是浮点数组。
推荐阅读
- javascript - 使用 Map() 函数通过 ReactJS 提取双嵌套 JSON 数据
- webpack - webpack-dev-server 热加载器不工作
- php - 使用 ssh 隧道连接拒绝用户 'root'@'localhost' 的访问(使用密码:YES)
- python - 将标题添加到scrapy?
- react-native - 在 refreshcontrol 触发后 React Native Stop ScrollView 事件
- javascript - 运行 SQL 查询,将响应对象作为数组返回。我需要知道如何创建循环来读取返回的每条记录
- python - Django:禁止(未设置 CSRF cookie。),为什么会这样,以及如何解决它
- javascript - 将内容加载到 Kendo UI KendoWindow 时处理错误
- python - 用另一个数据框 pandas 重命名每 2 列
- python - 在 python 中使用 Espeak 和 os