Как 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
. Может ли кто-то пролить свет на ситуацию?
Ответы
Ответ 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