2-й параметр glBufferData
должен быть размером буфера.
1-й параметр glDrawArrays
должен быть примитивом тип (например, GL_POINTS
).
Далее вы пропустили определение массива данных вершин с помощью glVertexPointer
, а атрибут фиксированной функции (capabilit на стороне клиента) должен быть включен с помощью glEnableClientState
.Недостаточно создать и инициализировать хранилище данных объекта буфера.Например:
// reserve buffer name (value)
glGenBuffers(1, &vboId);
// create buffer object
glBindBuffer(GL_ARRAY_BUFFER, vboId);
// create data store
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), 0, GL_STREAM_DRAW);
// init data
glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(vertex3f), vertices);
// define array of vertex data
glVertexPointer(3, GL_FLOAT, 0, nullptr);
// now the buffer is not needed to be bound any more
glBindBuffer(GL_ARRAY_BUFFER, 0);
// enable vertex array
glEnableClientState(GL_VERTEX_ARRAY);
// draw points
glDrawArrays(GL_POINTS, 0, sizeof(vertices)/sizeof(vertex3f));
// disable vertex array
glDisableClientState(GL_VERTEX_ARRAY);
Нет необходимости создавать объект буфера вершин , поскольку последний параметр glVertexPointer
может быть указателем наданные массива (в Legacy OpenGL ):
glVertexPointer(3, GL_FLOAT, 0, vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_POINTS, 0, sizeof(vertices)/sizeof(vertex3f));
glDisableClientState(GL_VERTEX_ARRAY);
Обратите внимание, что только если именованный объект привязан к цели GL_ARRAY_BUFFER
, последний параметр glVertexPointer
рассматривается каксмещение в этот буфер.