我一直在使用OpenGL中的VBO,我显然不明白我在这里做错了什么。我想显示一个带有文本的VBO,每个帧都会更新。这次的目标是FPS计数器,但其他应用程序绝对可行。
直到实际代码:如果我在初始化函数中设置VBO然后在渲染函数中绘制它,我可以让它工作得很好。但是,如果我尝试在绘图功能中编辑它,则不会显示任何内容。在调试时我发现所有包含数据的向量都是完全正确的(我甚至用相同的文本更新了VBO并且向量确实相同),所以问题必须在于我对VBO的处理,而不是内部的数据他们。
这是初始化/渲染命令:
glGenBuffers(1, &pntvbo);
glBindBuffer(GL_ARRAY_BUFFER, pntvbo);
glBufferData(GL_ARRAY_BUFFER, newpoints.size() * sizeof(vec3f), &newpoints[0], GL_STREAM_DRAW);
glGenBuffers(1, &indvbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indvbo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, newindex.size() * sizeof(unsigned int), &newindex[0], GL_STREAM_DRAW);
我也试过这个,但没有成功:
glBindBuffer(GL_ARRAY_BUFFER, pntvbo);
glBufferData(GL_ARRAY_BUFFER, newpoints.size() * sizeof(vec3f), NULL, GL_STREAM_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, newpoints.size() * sizeof(vec3f), &newpoints[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indvbo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, newindex.size() * sizeof(unsigned int), NULL, GL_STREAM_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,0, newindex.size() * sizeof(unsigned int), &newindex[0]);
并且绘制命令本身:
glClientActiveTexture(GL_TEXTURE5);
glEnable(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, &newtexts[0]);
glBindBuffer(GL_ARRAY_BUFFER, pntvbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indvbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,sizeof(vec3f),0);
glDrawElements(GL_TRIANGLES, newindex.size() , GL_UNSIGNED_INT, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
我确定我在这里做错了,但我无法弄清楚我的生活是什么。正如我所说,如果我只在程序的初始化函数中初始化或编辑VBO,一切都很好,但是一旦将相同的函数放入渲染函数中,就不会显示任何内容。任何帮助将不胜感激。