Как я могу использовать VBO в GLX?(Хотите использовать glDrawArrays (GL_ARRAY_BUFFER, x, x) - PullRequest
0 голосов
/ 25 сентября 2019

Мне удалось glDrawArrays() в OpenGL, но он не работает в моей среде GLX.Сценарий кода точно такой же с обычными OpenGL и GLX, но glDrawArrays() ничего не рисует в GLX.

glGenBuffers(1, &vboId);

glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, offset, 0, GL_STREAM_DRAW);

glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(vertex3f), vertices);

glDrawArrays(GL_ARRAY_BUFFER, 0, sizeof(vertices)/sizeof(vertex3f));

glBegin(GL_POINTS);
glVertex3f(x0, y0, z0);
glVertex3f(x1, y1, z1);
glEnd();

Я ожидал, glDrawArrays() рисует некоторые точки, а также glBegin() / glEnd(), но толькоglBegin() / glEnd() рисует точки, но не glDrawArrays() в GLX.

glDrawArrays() хорошо работает на OpenGL.

1 Ответ

0 голосов
/ 25 сентября 2019

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 рассматривается каксмещение в этот буфер.

...