OpenGL: использование VBO с std :: vector

Я пытаюсь загрузить объект и использовать 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 но это не работает

2

Решение

Ты хочешь сделать:

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);

Всегда хорошо читать документация. Кроме того, я бы посоветовал вам взять хорошую книгу по С ++, которая, вероятно, будет хорошим способом избежать подобных ошибок.

13

Другие решения

Не забудьте проверить, есть ли у вас 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);

Взяв ссылку на первый элемент вектора, вы получите указатель на сами данные.

4

По вопросам рекламы [email protected]