На самом деле это обычный способ разделения данных вершин на позиции, цвета и т. Д. С использованием нескольких массивов / буферов.
Последний раз, когда я вступал в контакт с ES 2.0, был в контексте WebGL (которыйis имеет немного иную спецификацию, но в конечном итоге основана на ES 2.0).
В основном делается запись данных в отдельные буферы с использованием
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(float), positions, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(float), colors, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
...
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(ushort), indices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
с позициями и цветами, являющимися массивами с плавающей запятой, содержащимив этом случае данные вершин и индексы, содержащие индексы как шорты без знака.
Чтобы отобразить эти данные, вы должны использовать буферы и указатели атрибутов для своего шейдера:
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(vertexPositionAttribute, 3, GL_FLOAT, false, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
glVertexAttribPointer(vertexColorAttribute, 4, GL_FLOAT, false, 0, 0);
Наконец, связатьбуфер индекса:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
и рендер:
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0);
Чтобы получить атрибуты:
glUseProgram(shaderProgram);
vertexPositionAttribute= glGetAttribLocation(shaderProgram, "vertexPosition");
glEnableVertexAttribArray(vertexPositionAttribute);
vertexColorAttribute = glGetAttribLocation(shaderProgram, "vertexColor");
glEnableVertexAttribArray(vertexColorAttribute );
...
Если у вас нет пользовательских шейдеров (используется фиксированныйфункция) вы можете использовать вместо
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexPointer(3, GL_FLOAT, false, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
glColorPointer(4, GL_FLOAT, false, 0, 0);
.Я бы посоветовал против этого, так как он устарел (если вообще доступен в ES 2.0).Если вы все еще хотите его использовать, вы можете вообще пропустить весь буферный бизнес и использовать
glVertexPointer(3, GL_FLOAT, false, 0, positions);
glColorPointer(4, GL_FLOAT, false, 0, colors);
с
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, indices);
Надеюсь, это не слишком запутало и немного поможет.Для дальнейшего чтения, хотя и нацеленного на OpenGL, я бы предложил Nehe руководства .