你可以查看这个教程,它基本上是做你想要实现的相同的事情,但是使用的是立方体而不是正方形。它也使用了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 =
glm::mat4 new = modelMatrix * nodeTransform;
matrixStack.push_back(new);
for (every child) {
render();
}
matrixStack.pop_back();
对于绘图部分,我猜想你可以将顶点数组与正方形顶点绑定,然后在每个子元素调用glDrawArrays之前,在着色器中更新模型矩阵。