OpenGL 3 / OpenGL-ES 2 отказались от концепции предопределенных атрибутов вершин "position", "normal", "texcoord",…, которые предоставляются через glVertexPointer, glNormalPointer, glTexCoordPointer,…
Вместов ваших шейдерах вы вводите пользовательские varyings
/ in
идентификаторы атрибутов.На эти идентификаторы ссылается так называемый атрибут location , числовой индекс.glBindAttribLocation
позволяет присваивать идентификаторы атрибутов определенным местоположениям.В случае вышеупомянутого фрагмента кода, кажется, существует глобальная константа VERTEX_ARRAY
- введенная программным кодом (!), Т.е. не предопределенная OpenGL или чем-то в этом роде, - которая универсально используется для атрибута varing / in myVertex
в шейдере.
Таким образом, конкретный атрибут вершины может быть снабжен данными glVertexAttribPointer
через общий токен VERTEX_ARRAY
в выражении, подобном следующему:
glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, false, 0, isVBO ? (char*)vertex.offset : (char*)vertex.data + vertex.offset);
Конечно, точная семантика вызовов glVertexAttribPointer зависит от конкретной программы, которая их выполняет.
Вместо (глобальной) константы VERTEX_ARRAY
вы также можете использовать переменную shader.attrib.vertex
, которую выустановить для каждого шейдера, используя
shader.attrib.vertex = glGetAttribLocation(shader.program_object, "myVertex");
и использовать эту переменную в вызовах glVertexAttribPointer
glVertexAttribPointer(shader.attrib.vertex, …)