我正在尝试加载一个对象并使用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()
遇到第3个参数为const GLvoid *data
的问题。我正在通过&vert
,但它不起作用。
答案 0 :(得分: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);
阅读documentation总是好的。另外,我建议你选一本好的C ++书籍,这可能是你避免犯这些错误的好方法。
答案 1 :(得分: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);
引用向量的第一个元素会为您提供指向数据本身的指针。
答案 2 :(得分:0)
我可能有点迟了,但是对于其他需要帮助的人,您必须从数据的开头获取一个指针,可以使用&vert.front()
或&vert[0]
>
所以它应该看起来像这样:
glBufferData(GL_ARRAY_BUFFER, vert.size() * sizeof(float), &vert.front(), GL_STATIC_DRAW);