实际上,这是使用多个数组/缓冲区将顶点数据分成位置、颜色等的常用方法。
上次我接触 ES 2.0 是在 WebGL 的上下文中(它的规范略有不同,但最终基于 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 教程。