问题描述
我有一个不知道如何解决的问题。我将C ++与GLEW和GLFW一起使用,初始化GLFW,创建窗口,将窗口设置为当前上下文,然后初始化GLEW。所有这些都发生在主要功能上。
当在方法,类中组织创建VAO和VBO的代码时出现问题,我看到生成了VAO,生成了VBO,但是当使用glBufferData将数据发送到GPU时, 这是行不通的。如果我采用这段代码并将其移至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);
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,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,0);
glBindBuffer(GL_ARRAY_BUFFER,0);
}
解决方法
问题出在这里sizeof(data)
。
方法data
中有一个指针,sizeof(data)
返回该指针的大小,而不是原始数组的大小。
要解决的问题是将大小作为参数与数据一起传递给方法。或使用std::vector<float>
而不是浮点数数组。