Подтвердить что ты не робот

Как glDrawArrays знает, что рисовать?

Я следую нескольким учебникам OpenGL, и немного смущен этим фрагментом кода:

glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); //Bind GL_ARRAY_BUFFER to our handle
glEnableVertexAttribArray(0); //?
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); //Information about the array, 3 points for each vertex, using the float type, don't normalize, no stepping, and an offset of 0. I don't know what the first parameter does however, and how does this function know which array to deal with (does it always assume we're talking about GL_ARRAY_BUFFER?

glDrawArrays(GL_POINTS, 0, 1); //Draw the vertices, once again how does this know which vertices to draw? (Does it always use the ones in GL_ARRAY_BUFFER)

glDisableVertexAttribArray(0); //?
glBindBuffer(GL_ARRAY_BUFFER, 0); //Unbind

Я не понимаю, как glDrawArrays знает, какие вершины рисовать, и что все, что нужно сделать с glEnableVertexAttribArray. Может ли кто-то пролить свет на ситуацию?

4b9b3361

Ответ 1

Вызов glBindBuffer говорит OpenGL использовать vertexBufferObject, когда ему требуется GL_ARRAY_BUFFER.

glEnableVertexAttribArray означает, что вы хотите, чтобы OpenGL использовал массивы атрибутов vertex; без этого вызова данные, которые вы указали, будут игнорироваться.

glVertexAttribPointer, как вы сказали, сообщает OpenGL, что делать с предоставленными данными массива, поскольку OpenGL не знает по сути, в каком формате будут находиться данные.

glDrawArrays использует все вышеперечисленные данные для рисования точек.

Помните, что OpenGL - это большой конечный автомат. Большинство вызовов функций OpenGL изменяют глобальное состояние, к которому вы не можете напрямую обращаться. Поэтому код заканчивается на glDisableVertexAttribArray и glBindBuffer(..., 0): вы должны вернуть это глобальное состояние, когда закончите его использование.

Ответ 2

DrawArrays берет данные из ARRAY_BUFFER.

Данные "отображаются" в соответствии с вашей настройкой в ​​ glVertexAttribPointer, которая сообщает, что такое определение вашей вершины.

В вашем примере у вас есть один атрибут вершины (glEnableVertexAttribArray) в позиции 0 (обычно вы можете иметь 16 атрибутов вершин, каждый 4 поплавка). Затем вы сообщаете, что каждый атрибут будет получен путем чтения 3 GL_FLOATS из буфера, начиная с позиции 0.

отличный учебник здесь: http://www.arcsynthesis.org/gltut/Basics/Tut02%20Vertex%20Attributes.html