您可以查看本教程,基本上是在做您想要实现的相同操作,但使用立方体而不是正方形。它也使用 VBO:
http://www.learnopengles.com/android-lesson-seven-an-introduction-to-vertex-buffer-objects-vbos/
关于矩阵,在 OpenGL ES 2.0 中,您不再有任何与矩阵相关的函数,但您可以使用 glmath 库,它具有相同的功能(以及更多功能):
http://glm.g-truc.net/
它是一个头文件库,因此您只需将其复制到某个地方并将其包含在您需要的地方。
我不确定我是否完全理解您的目标,但我想您可以复制图形卡中一个正方形的数据(使用 VBO),然后重复更新每个正方形的模型矩阵。
如果您的方格之间有某种层次结构(例如,如果其中一个移动,其左侧的一个必须相应移动),则矩阵堆栈的概念是有意义的。
你可以把它想象成一个由正方形组成的骨架。如果肩膀移动,手臂中的所有部分也会移动(手、手指等)。您可以通过使用矩阵堆栈来模拟它。你可以用你的所有方块创建某种树,这样每个方块都有一个“后代”列表,它将应用与父级相同的转换。然后您可以像这样递归地渲染所有正方形:
- 将变换应用于根平方
- 将转换推送到队列中
- 为每个孩子调用相同的渲染函数
- 每个孩子读取队列顶部的矩阵,将其乘以自己的变换,将新矩阵推入队列并调用孩子
- 之后,每个孩子都会弹出他们之前推送的矩阵
使用 glmath 非常简单,您只需要创建一个矩阵队列(在本例中为 std:vector):
std::vector<glm::mat4> matrixStack;
然后对每个孩子:
glm::mat4 modelMatrix = matrixStack.back();
glm::mat4 nodeTransform = /*apply your transform here*/
glm::mat4 new = modelMatrix * nodeTransform;
matrixStack.push_back(new);
/*Pass in the new matrix to the shader and call to glDrawArrays or whatever to render your square*/
for (every child) {
render();
}
matrixStack.pop_back();
对于绘图部分,我想您可以将顶点数组与方形顶点绑定,然后在调用 glDrawArrays 之前为每个孩子更新着色器中的模型矩阵。