【发布时间】: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 的那段代码移动到类的方法中,它就不起作用,这是唯一的变化。