2

我正在尝试加载一个对象并使用 VBO 和 glDrawArrays() 来渲染它。问题是一个简单的浮点指针float f[]={...}在我的情况下不起作用,因为我通过了这个指针可以存储的值的限制。所以我的解决方案是使用向量。而且它不起作用...

这是我的代码:

unsigned int vbo;
vector<float*> vert;

...
vert.push_back(new float(i*size));
vert.push_back(new float(height*h));
vert.push_back(new float(j*size));
...

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vert), &vert, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

并渲染:

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);

我在glBufferData()第三个参数的位置有问题const GLvoid *data。我正在通过,&vert但它不起作用。

4

3 回答 3

13

你想做:

unsigned int vbo;
vector<float> vert;

...
vert.push_back(i*size);
vert.push_back(height*h);
vert.push_back(j*size);
...

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vert.size() * sizeof(float), vert.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

阅读文档总是好的。另外,我建议您选择一本好的 C++ 书籍,这可能是您避免犯此类错误的好方法。

于 2013-01-09T11:39:14.857 回答
5

记得检查你是否有 C++11 或vert.data不会编译。

如果您查看std::vector文档,您会发现std::vector::data()它带有 C++11 标记。

http://www.cplusplus.com/reference/vector/vector/data/

如果您没有 C++11,您可以执行以下操作:

unsigned int vbo;
vector<float> vert;

...
vert.push_back(i*size);
vert.push_back(height*h);
vert.push_back(j*size);
...

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vert.size(), &vert[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

引用向量的第一个元素会为您提供指向数据本身的指针。

于 2013-01-09T12:02:17.687 回答
0

我可能有点晚了,但是对于其他需要帮助的人,您必须从数据的开头获取一个指针,可以使用&vert.front()&vert[0]

所以它应该看起来像这样:

glBufferData(GL_ARRAY_BUFFER, vert.size() * sizeof(float), &vert.front(), GL_STATIC_DRAW);
于 2019-12-31T12:04:18.967 回答